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?
Perfetto. Grazie. –