2011-10-18 5 views
5

Estoy tratando de burlarme del cliente Predis en una prueba PHPUnit. Cuando llamo al método que he intentado burlar, al final de la prueba, PHPUnit me dice que no se cumplió la expectativa.¿Por qué mi falso PHPUnit del cliente Predis no coincide con mis expectativas?

Aquí está un ejemplo de código que reproduce mi 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"); 
} 

}

Y PHPUnit cree que el método no fue llamado:

1) MockRedisTest :: testMockRedis Error de expectativa para el nombre del método es igual a cuando se invoca 1 hora (s). Se esperaba que el método se llamara 1 vez, en realidad se llamara 0 veces.

¿Por qué? ¿Es porque el cliente Predis parece estar utilizando __call para responder a las llamadas a métodos que coinciden con los comandos redis?

ACTUALIZACIÓN: me da la impresión de que tiene algo que ver con el método __call. Cambiando el código a esto funciona:

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"); 
} 

Sin embargo, estoy satisfecho con esto. ¿Hay una mejor manera de simular clases que usan __call para métodos proxy?

Respuesta

8

Creo que se puede utilizar

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

para forzar al objeto de burla saber acerca de su función mágica. Esto limita las capacidades de simulacro al método exists(). Tendrás que incluir específicamente cualquier otro método para burlarte.

+0

Perfecto. Gracias. –

0

Si quiere burlarse de un perfil específico del servidor y asegurarse de que no está llamando a métodos de una versión de servidor diferente, utilice

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

Para PHPUnit 5, utilice

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

Para realizar su simulacro conocer el método "existe" (o cualquier otro comando nativo de redis)

Cuestiones relacionadas