2012-03-02 22 views
11

Usando PHPUnit, me pregunto si podemos simular un objeto para probar si se llama a un método con un parámetro esperado, y ¿un valor devuelto?PHPunit: Cómo simular un método que tiene un parámetro Y un valor devuelto

En el doc, hay ejemplos con el paso de parámetros, o el valor devuelto, pero no tanto ...

He intentado utilizar esto:

 
// My object to test 
$hoard = new Hoard(); 
// Mock objects used as parameters 
$item = $this->getMock('Item'); 
$user = $this->getMock('User', array('removeItem')); 
... 
$user->expects($this->once()) 
    ->method('removeItem') 
    ->with($this->equalTo($item)); 
$this->assertTrue($hoard->removeItemFromUser($item, $user)); 

Mi aserción falla porque Tesoro :: removeItemFromUser() debería devolver el valor devuelto de User :: removeItem(), que es verdadero.

 
$user->expects($this->once()) 
    ->method('removeItem') 
    ->with($this->equalTo($item), $this->returnValue(true)); 
$this->assertTrue($hoard->removeItemFromUser($item, $user)); 

también falla con el siguiente mensaje: "recuento de parámetros para la invocación del usuario :: removeItem (Mock_Item_767aa2db objeto (...)) es demasiado bajo."

 
$user->expects($this->once()) 
    ->method('removeItem') 
    ->with($this->equalTo($item)) 
    ->with($this->returnValue(true)); 
$this->assertTrue($hoard->removeItemFromUser($item, $user)); 

También se produce el mensaje siguiente: "PHPUnit_Framework_Exception: el parámetro matcher ya está definido, no puede redefinir"

¿Qué debo hacer para probar este método correctamente?

Respuesta

18

Necesita usar will en lugar de with para returnValue y sus amigos.

$user->expects($this->once()) 
    ->method('removeItem') 
    ->with($item) // equalTo() is the default; save some keystrokes 
    ->will($this->returnValue(true)); // <-- will instead of with 
$this->assertTrue($hoard->removeItemFromUser($item, $user)); 
Cuestiones relacionadas