2012-04-15 18 views
9

Ho un caso di utilizzo semplice. Voglio avere un metodo di configurazione che farà sì che il mio oggetto fittizio per restituire un valore predefinito:PHPUnit Mock Modificare le aspettative in seguito

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

Ma poi in alcuni test, voglio restituire un valore diverso:

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

I Ho usato GoogleMock per C++ in passato e aveva "returnByDefault" o qualcosa per gestirlo. Non riuscivo a capire se questo è possibile in PHPUnit (non c'è documentazione api e il codice è difficile da leggere per trovare quello che voglio).

Ora non posso semplicemente cambiare $this->myservice in una nuova simulazione, perché durante l'installazione, la passo in altre cose che devono essere prese in giro o testate.

La mia unica altra soluzione è che perdo il vantaggio del setup e invece devo costruire tutti i miei mock per ogni test.

risposta

2

È possibile spostare il codice setUp() in un altro metodo, che ha parametri. Questo metodo viene quindi chiamato da setUp() e può essere chiamato anche dal metodo di prova, ma con parametri diversi da quelli predefiniti.

+1

Come può questo risolvere il problema? Il metodo 'setUp()' sarebbe chiamato in ogni caso –

+0

@MassimilianoArione si ma puoi ricreare il tuo '$ this-> myservice' e cambiare il valore di ritorno – rndstr

0

avanti la realizzazione del mock setUp() ma impostare l'aspettativa separatamente in ciascuna prova:

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

    } 


} 

Le due aspettative non interferirà con l'altro perché PHPUnit istanzia una nuova istanza di FooTest per eseguire ogni test.

Problemi correlati