Me he encontrado con un problema extraño con los objetos de simulación de PHPUnit. Tengo un método que debería llamarse dos veces, entonces estoy usando el matcher "at". Esto funciona por primera vez cuando se llama al método, pero por alguna razón, la segunda vez que se llama, obtengo "El método burlado no existe". He usado el matcher "at" antes y nunca me he encontrado con esto.
Mi código es algo como:
class MyTest extends PHPUnit_Framework_TestCase
{
...
public function testThis()
{
$mock = $this->getMock('MyClass', array('exists', 'another_method', '...'));
$mock->expects($this->at(0))
->method('exists')
->with($this->equalTo('foo'))
->will($this->returnValue(true));
$mock->expects($this->at(1))
->method('exists')
->with($this->equalTo('bar'))
->will($this->returnValue(false));
}
...
}
Cuando ejecuto la prueba, me sale:
Expectation failed for method name is equal to <string:exists> when invoked at sequence index 1.
Mocked method does not exist.
Si quito el segundo de coincidencias, no me sale el error.
¿Alguien ha topado con esto antes?
Gracias!
Sí, pero creo que es un error en PHPUnit. La documentación dice: Devuelve un marcador que coincide cuando se invoca el método para el que se evalúa en el índice $ dado. – gphilip
De acuerdo, además sería mucho más fácil y más útil espiar las llamadas a métodos si el índice at() se incrementara por método. –
Parece que casi cualquier uso erróneo de las expectativas provocará el mensaje "El método simulado no existe". Bueno saber. –