php unit-testing mocking phpunit

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''));