PHPUnit teste une méthode qui change un champ d'entité

Sep 09 2020

Disons que j'ai une entité avec certains champs et une méthode qui fait ce qui suit

public function changeEntityField(Entity $entity) { $entity->set('field_xyz', 20);
  $entity->save(); return $entity;
}

Je sais comment se moquer d'une entité et définir ses valeurs de champ via $entity->expects($this->any())->method('get')->with('field_xyz')->willReturn(10)etc. et la transmettre à la fonction à tester.

Ce que je ne comprends pas encore, c'est comment tester la fonction qui définit vraiment la valeur field_xyz20?

j'ai essayé

$entity = $this->getMockBuilder(Application::class)
  ->disableOriginalConstructor()
  ->getMock();
$field = $this->getMockBuilder(FieldItemListInterface::class)
      ->disableOriginalConstructor()
      ->getMock();
$field->expects($this->any())
      ->method('__get')
      ->with('value')
      ->willReturn(10);
$entity->expects($this->any())
  ->method('get')
  ->with('field_xyz')
  ->willReturn($field); $result = $this->service->changeEntityField($entity);
$this->assertEqual($result->get('field_xyz')->value, 20);

mais il renvoie 10. Comment se moquer des méthodes -> set () de l'entité? Ou dois-je travailler avec de vraies entités et ne pas se moquer dans de tels cas?

Réponses

1 MacSim Sep 10 2020 at 03:33

Vous ne pouvez pas faire cela dans un test unitaire , vous devez travailler avec des entités réelles dans un test fonctionnel car il $entity->save();faut que la base de données soit chargée.

Et comme retournera une entité, il n'y a aucun moyen de pouvoir être égal à 10 ou 20. Ce sera égal à une entité. Mais dans un test fonctionnel, vous pourrez charger l'entité et vérifier si le champ a la bonne valeur ou non après l'appel de votre fonction.$result = $this->service->changeEntityField($entity);$result