PHPUnit objetos simulados y sugerencias de tipo de método
unit-testing mocking (1)
Estoy intentando crear un objeto simulado de / SplObserver usando PHPunit y adjuntar el objeto simulado a un / SplSubject. Cuando intento adjuntar el objeto simulado a una clase que implementa / SplSubject, aparece un error fatal que puede detectarse y dice que el objeto simulado no implementa / SplObserver:
PHP Catchable fatal error: Argument 1 passed to ../AbstractSubject::attach() must implement interface SplObserver, instance of PHPUnit_Framework_MockObject_Builder_InvocationMocker given, called in ../Decorator/ResultCacheTest.php on line 44 and defined in /users/.../AbstractSubject.php on line 49
Más o menos, aquí está el código:
// Edit: Using the fully qualified name doesn''t work either
$observer = $this->getMock(''SplObserver'', array(''update''))
->expects($this->once())
->method(''update'');
// Attach the mock object to the cache object and listen for the results to be set on cache
$this->_cache->attach($observer);
doSomethingThatSetsCache();
No estoy seguro de si hace una diferencia, pero estoy usando PHP 5.3 y PHPUnit 3.4.9
Actualizar
Oh, en realidad, el problema es bastante simple, pero de alguna manera difícil de detectar. En lugar de:
$observer = $this->getMock(''SplObserver'', array(''update''))
->expects($this->once())
->method(''update'');
Tu tienes que escribir:
$observer = $this->getMock(''SplObserver'', array(''update''));
$observer->expects($this->once())
->method(''update'');
Esto se debe a que getMock()
devuelve una cosa diferente al method()
, por eso obtuviste el error. Pasaste el objeto equivocado para attach
.
Respuesta original
Creo que tienes que calificar completamente el tipo de simulacro:
$observer = $this->getMock(''/SplObserver'', array(''update''));