web-dev-qa-db-fra.com

Mocks vs Stubs dans PHPUnit

Je sais que les stubs vérifient l'état et que les simulateurs vérifient le comportement.

Comment puis-je faire une maquette dans PHPUnit pour vérifier le comportement des méthodes? Phpunit n'a pas de méthodes de vérification (verify ()), et je ne sais pas comment faire un moks c'est PHPUnit.

Dans la documentation, pour créer un stub est bien expliqué:

// Create a stub for the SomeClass class.
$stub = $this->createMock(SomeClass::class);

// Configure the stub.
$stub
    ->method('doSomething')
    ->willReturn('foo');

// Calling $stub->doSomething() will now return 'foo'.
$this->assertEquals('foo', $stub->doSomething());

Mais dans ce cas, je vérifie le statut, en disant que renvoie une réponse.

Comment serait l'exemple pour créer une maquette et vérifier le comportement?

16
RodriKing

PHPUnit prend en charge deux façons de créer des doubles de test. À côté du cadre de simulation PHPUnit hérité, il prend désormais en charge la prophétie prête à l'emploi.

PHPUnit Mocking Framework

La méthode createMock est utilisée pour créer trois doubles de test les plus connus. C'est la façon dont vous configurez l'objet qui en fait un mannequin, un talon ou une maquette.

Vous pouvez également créer des stubs de test avec le générateur de simulation (getMockBuilder renvoie le générateur de simulation). C'est juste une autre façon de faire la même chose qui vous permet de modifier quelques options de simulation supplémentaires avec une interface fluide (voir la documentation pour plus).

Mannequin

Le mannequin est transmis, mais jamais réellement appelé, ou s'il est appelé, il répond avec une réponse par défaut (principalement null). Il existe principalement pour satisfaire une liste d'arguments.

$dummy = $this->createMock(SomeClass::class);

// SUT - System Under Test
$sut->action($dummy);

Bout

Les stubs sont utilisés avec des méthodes de type requête - des méthodes qui retournent des choses, mais ce n'est pas important si elles sont réellement appelées.

$stub = $this->createMock(SomeClass::class);
$stub->method('getSomething')
    ->willReturn('foo');

$sut->action($stub);

Moquer

Les mocks sont utilisés avec des méthodes de type commande - il est important de les appeler, et nous ne nous soucions pas beaucoup de leur valeur de retour (les méthodes de commande ne retournent généralement aucune valeur).

$mock = $this->createMock(SomeClass::class);
$mock->expects($this->once())
    ->method('doSomething')
    ->with('bar');

$sut->action($mock);

Les attentes seront vérifiées automatiquement une fois l'exécution de votre méthode de test terminée. Dans l'exemple ci-dessus, le test échouera si la méthode doSomething n'a pas été appelée sur SomeClass, ou si elle a été appelée avec des arguments différents de ceux que vous avez configurés.

Espion

Non supporté.

Prophétie

La prophétie est désormais prise en charge par PHPUnit prête à l'emploi, vous pouvez donc l'utiliser comme alternative au cadre de simulation hérité. Encore une fois, c'est la façon dont vous configurez l'objet qui en fait un type spécifique de test double.

Mannequin

$dummy = $this->prophesize(SomeClass::class);

$sut->action($dummy->reveal());

Bout

$stub = $this->prophesize(SomeClass::class);
$stub->getSomething()->willReturn('foo');

$sut->action($stub->reveal());

Moquer

$mock = $this->prophesize(SomeClass::class);
$mock->doSomething('bar')->shouldBeCalled();

$sut->action($mock->reveal());

Espion

$spy = $this->prophesize(SomeClass::class);

// execute the action on system under test
$sut->action($spy->reveal());

// verify expectations after 
$spy->doSomething('bar')->shouldHaveBeenCalled();
48
Jakub Zalas