2012-03-02 4 views
11

Utilizzando PHPUnit, mi chiedo se possiamo prendere in giro un oggetto per verificare se un metodo viene chiamato con un parametro previsto, e un valore restituito?PHPunit: Come simulare un metodo che ha un parametro E un valore restituito

Nel doc, ci sono esempi con il passaggio di parametri, o valore restituito, ma non sia ...

Ho provato ad utilizzare questo:

 
// 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)); 

mia asserzione fallisce perché Hoard :: removeItemFromUser() dovrebbe restituire il valore restituito di User :: removeItem(), che è true.

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

inoltre non riesce con il seguente messaggio: "count dei parametri per l'invocazione d'uso :: removeItem (Mock_Item_767aa2db Object (...)) è troppo bassa."

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

fallisce anche con il seguente messaggio: "PHPUnit_Framework_Exception: Parameter matcher è già definito, non può ridefinire"

Cosa devo fare per verificare correttamente questo metodo.

risposta

18

È necessario utilizzare will anziché with per returnValue e amici.

$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));