¿Estás cansado de recordar la diferencia entre burladores, parciales y espías en Mockery? Lo soy, y es por eso que creé double()
, un método auxiliar simple para facilitar el uso de Mockery.
Cuando escribo pruebas no quiero pensar en las diferencias entre falsificaciones , burlas y espías . Solo quiero crear una prueba genérica doble y concentrarme en escribir mi prueba. Esta generalización es común en otros marcos de prueba como RSpec, td.js y más.
Para instalar la última versión del asistente double()
, ejecute el comando:
composer require --dev jasonmccreary/test-double
Cada vez que necesite crear una prueba doble, simplemente llame double()
De forma predeterminada, double()
devuelve un objeto que le permitirá crear métodos auxiliares y verificar las llamadas a métodos.
<?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 ' );
En Mockery, este doble de prueba es equivalente a Mockery::mock()->shouldIgnoreMissing()
o, en versiones recientes, Mockery::spy()
.
También puedes pasar double()
una referencia a una clase o interfaz. Esto creará un objeto de prueba que extiende la clase o implementa la interfaz. Esto permite que el doble pase cualquier sugerencia de tipo o verificación de tipo en su implementación.
<?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 );
Finalmente, double()
acepta un segundo argumento de passthru . De forma predeterminada, el paso a través es false
. Cuando se establece en true
, el objeto de prueba pasará cualquier llamada a método al objeto subyacente.
En Mockery, esto es equivalente a 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 ' );
Nota: passthru solo se puede utilizar al crear una prueba doble con una referencia de clase, ya que es el único momento en el que existe una implementación subyacente.
Al final, double()
es una forma obstinada de crear objetos de prueba para su código subyacente. Si no satisface sus necesidades, siempre puede crear un Mockery::mock()
directamente. Sin embargo, hacerlo es probable que esté probando su implementación de una manera que no refleja el comportamiento del mundo real. Recuerde, double()
devuelve un objeto que implementa MockeryInterface
. Por lo tanto, puede tratarse como cualquier otro objeto Mockery::mock()
.