PHPUnit testet eine Methode, die ein Entitätsfeld ändert

Sep 09 2020

Angenommen, ich habe eine Entität mit bestimmten Feldern und eine Methode, die Folgendes ausführt

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

Ich weiß, wie man eine Entität verspottet und ihre Feldwerte über $entity->expects($this->any())->method('get')->with('field_xyz')->willReturn(10)usw. festlegt und an die zu testende Funktion übergibt.

Was ich noch nicht bekomme ist, wie man die Funktion testet, setzt die wirklich field_xyzauf 20?

Ich habe es versucht

$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);

aber es gibt 10 zurück. Wie verspotte ich die -> set () -Methoden der Entität? Oder muss ich mit realen Entitäten arbeiten und in solchen Fällen nicht verspotten?

Antworten

1 MacSim Sep 10 2020 at 03:33

Dies ist in einem Komponententest nicht möglich . Sie müssen in einem Funktionstest mit realen Entitäten arbeiten, da $entity->save();die Datenbank geladen werden muss.

Und da eine Entität zurückgegeben wird, kann kein Weg gleich 10 oder 20 sein. Es wird gleich einer Entität sein. In einem Funktionstest können Sie die Entität jedoch laden und prüfen, ob das Feld den guten Wert hat oder nicht, nachdem Ihre Funktion aufgerufen wurde.$result = $this->service->changeEntityField($entity);$result