Фиктивные объекты PHPUnit и намек на тип метода
Я пытаюсь создать макет объекта \SplObserver с помощью PHPUnit и прикрепить издевательский объект к объекту \SplSubject. Когда я пытаюсь присоединить издевательский объект к классу, реализующему \SplSubject, я получаю заметную фатальную ошибку, в которой говорится, что издевательский объект не реализует \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
Более или менее, вот код:
// 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();
Я не уверен, что это имеет значение, но я использую PHP 5.3 и PHPUnit 3.4.9
38
Author: Michael Dowling, 2010-07-11
1 answers
Обновление
О, на самом деле, проблема довольно проста, но почему-то ее трудно обнаружить. Вместо:
$observer = $this->getMock('SplObserver', array('update'))
->expects($this->once())
->method('update');
Вы должны написать:
$observer = $this->getMock('SplObserver', array('update'));
$observer->expects($this->once())
->method('update');
Это потому, что getMock()
возвращает нечто иное, чем method()
, вот почему вы получили ошибку. Вы передали не тот объект attach
.
Оригинальный ответ
Я думаю, что вы должны полностью определить тип макета:
$observer = $this->getMock('\SplObserver', array('update'));
70
Author: Ionuț G. Stan, 2012-12-11 19:03:22