2011-10-18 9 views
5

Sto provando a prendere in giro il client Predis in un test PHPUnit. Quando chiamo il metodo che ho provato a prendere in giro, alla fine del test, PHPUnit mi sta dicendo che l'aspettativa non è stata soddisfatta.Perché il mio PHPUnit mock del client Predis non corrisponde alle mie aspettative?

Ecco un esempio di codice che riproduce il mio problema:

class MockRedisTest extends \PHPUnit_Framework_TestCase { 
private $mockRedis; 

public function testMockRedis() { 

    $mockRedis = $this->getMock('Predis\\Client'); 

    $mockRedis->expects( $this->once()) 
     ->method("exists") 
     ->with($this->equalTo("query-key")) 
     ->will($this->returnValue(true)); 

    $mockRedis->exists("query-key"); 
} 

}

E PHPUnit pensa che il metodo non è stato chiamato:

1) MockRedisTest :: testMockRedis Expectation fallita per il nome del metodo è uguale a quando invocato 1 volta/e. Il metodo doveva essere chiamato 1 volte, in realtà chiamato 0 volte.

Perché? È perché il client Predis sembra utilizzare __call per rispondere alle chiamate di metodo che corrispondono ai comandi redis?

AGGIORNAMENTO: Ho l'impressione che abbia qualcosa a che fare con il metodo __call. Cambiando il codice per questo funziona:

public function testMockRedis() { 

    $mockRedis = $this->getMock('Predis\\Client'); 

    $mockRedis->expects( $this->once()) 
     ->method("__call") 
     ->with("exists", $this->equalTo(array("query-key"))) 
     ->will($this->returnValue(true)); 

    $mockRedis->exists("query-key"); 
} 

Non sono sicuro che sia soddisfatto con questo però. C'è un modo migliore per simulare classi che usano i metodi __call to proxy?

risposta

8

Penso che si possa utilizzare

$mockRedis = $this->getMock('Predis\\Client', array('exists')); 
// ... 

per forzare l'oggetto fittizio di conoscere la vostra funzione magica. Questo limita le capacità di mock al metodo exists(). Dovrai includere in modo specifico ogni altro metodo per essere deriso.

+0

Perfetto. Grazie. –

0

Se si vuole prendere in giro un profilo server specifico e assicurarsi che non sta chiamando i metodi di una versione server diverso, utilizzare

<?php 
$mockRedis = $this->getMock('Predis\\Client', array_keys((new Predis\Profiles\ServerVersion26)->getSupportedCommands())); 
0

Per PHPUnit 5, utilizzare

$this->createPartialMock('Predis\\Client', ['exists']); 

Per rendere il vostro simulare il metodo "esiste" (o qualsiasi altro comando nativo redis)

Problemi correlati