Fatigué de vous souvenir de la différence entre les moqueurs, les partiels et les espions dans Mockery ? Je le suis, c'est pourquoi j'ai créé double()
- une méthode d'assistance simple pour faciliter l'utilisation de Mockery.
Lorsque j'écris des tests, je ne veux pas penser aux différences entre les faux , les moqueurs et les espions . Je viens de créer un double de test générique et de me concentrer sur l'écriture de mon test. Cette généralisation est courante dans d'autres frameworks de test tels que RSpec, td.js, etc.
Pour installer la dernière version de l'assistant double()
, exécutez la commande :
composer require --dev jasonmccreary/test-double
Chaque fois que vous avez besoin de créer un test double, appelez simplement double()
Par défaut, double()
renvoie un objet qui vous permettra de stub les méthodes ainsi que de vérifier les appels de méthode.
<?php
$ td = double ();
$ td -> shouldReceive ( ' someMethod ' )-> andReturn ( 5 );
$ td -> someMethod (); // returns 5
$ td -> unstubbedMethod (); // returns null, does not throw an exception
$ td -> anotherMethod ();
$ td -> shouldHaveReceived ( ' anotherMethod ' );
Dans Mockery, ce double de test est équivalent à Mockery::mock()->shouldIgnoreMissing()
ou, dans les versions récentes, Mockery::spy()
.
Vous pouvez également transmettre double()
une référence à une classe ou une interface. Cela créera un objet de test qui étend la classe ou implémente l'interface. Cela permet au double de transmettre des indices de type ou des vérifications de type dans votre implémentation.
<?php
$ td = double (Str::class);
$ td -> shouldReceive ( ' length ' )-> andReturn ( 5 );
$ td -> length (); // 5
$ td -> substr ( 1 , 3 ); // null
$ td instanceof Str; // true
$ td -> shouldHaveReceived ( ' substr ' )-> with ( 1 , 3 );
Enfin, double()
accepte un deuxième argument de passthru . Par défaut, le relais est false
. Lorsqu'il est défini sur true
, l'objet de test transmettra tous les appels de méthode à l'objet sous-jacent.
Dans Mockery, cela équivaut à Mockery::mock(Number::class)->shouldDeferMissing()
.
<?php
class Number
{
public function one ()
{
return 1 ;
}
public function random ()
{
return 5 ;
}
}
$ td = double (Number::class, true );
$ td -> shouldReceive ( ' random ' )-> andReturn ( 21 );
$ td -> random (); // 21
$ td -> one (); // 1
$ td instanceof Number; // true
$ td -> shouldHaveReceived ( ' one ' );
Remarque : le passthru ne peut être utilisé que lors de la création d'un double de test avec une référence de classe, car c'est la seule fois où une implémentation sous-jacente existe.
En fin de compte, double()
est une manière avisée de créer des objets de test pour votre code sous-jacent. Si cela ne répond pas à vos besoins, vous pouvez toujours créer directement un Mockery::mock()
. Cependant, cela signifie probablement que vous testez votre implémentation d'une manière qui ne reflète pas le comportement du monde réel. N'oubliez pas double()
renvoie un objet qui implémente MockeryInterface
. Il peut donc être traité comme n’importe quel autre objet Mockery::mock()
.