2012-04-15 15 views
9

Tengo un caso de uso simple. Quiero tener un método de configuración que hará que mi objeto de burla para devolver un valor predeterminado:PHPUnit Mock Cambia las expectativas más tarde

$this->myservice 
     ->expects($this->any()) 
     ->method('checkUniqueness') 
     ->will($this->returnValue(true)); 

Pero entonces, en algunos pruebas, quiero devolver un valor diferente:

$this->myservice 
     ->expects($this->exactly(1)) 
     ->method('checkUniqueness') 
     ->will($this->returnValue(false)); 

I Ya utilicé GoogleMock para C++ en el pasado y tenía "returnByDefault" o algo para manejar eso. No pude averiguar si esto es posible en PHPUnit (no hay documentación de API y el código es difícil de leer para encontrar lo que quiero).

Ahora no puedo simplemente cambiar $this->myservice a un nuevo simulacro, porque en la configuración, lo paso a otras cosas que deben ser burladas o probadas.

Mi única otra solución es que pierdo el beneficio de la configuración y en su lugar tengo que construir todos mis simulacros para cada prueba.

Respuesta

2

podría mover el código setUp() en otro método, que tiene parámetros. Este método se llama entonces desde setUp(), y puede llamarlo también desde su método de prueba, pero con parámetros diferentes a los predeterminados.

+1

¿Cómo puede esto resolver el problema? El método 'setUp()' se llamaría de todos modos –

+0

@MassimilianoArione sí, pero puede volver a crear su '$ this-> myservice' y cambiar el valor de retorno – rndstr

0

continuar la construcción de la maqueta en setUp() pero establezca la expectativa por separado en cada prueba:

class FooTest extends PHPUnit_Framework_TestCase { 
    private $myservice; 
    private $foo; 
    public function setUp(){ 
    $this->myService = $this->getMockBuilder('myservice')->getMock(); 
    $this->foo = new Foo($this->myService); 
    } 


    public function testUniqueThing(){ 
    $this->myservice 
     ->expects($this->any()) 
     ->method('checkUniqueness') 
     ->will($this->returnValue(true)); 

    $this->assertEqual('baz', $this->foo->calculateTheThing()); 
    } 

    public function testNonUniqueThing(){ 
    $this->myservice 
     ->expects($this->any()) 
     ->method('checkUniqueness') 
     ->will($this->returnValue(false)); 

    $this->assertEqual('bar', $this->foo->calculateTheThing()); 

    } 


} 

Los dos expectativas no interferirán entre sí debido a PHPUnit instancia una nueva instancia de FooTest para ejecutar cada prueba.

Cuestiones relacionadas