Фиктивные объекты PHPUnit и вывод подсказок типа метода

Я пытаюсь создать фиктивный объект \SplObserver с помощью PHPunit и присоединить дразнивший объект к \SplSubject. Когда я пытаюсь присоединить дразнивший объект к классу, который реализует \SplSubject, я получаю catchable фатальную ошибку, говоря, что дразнивший объект не реализует \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

40
задан Michael Dowling 11 July 2010 в 07:24
поделиться

1 ответ

Update

О, на самом деле, проблема довольно проста, но почему-то ее трудно заметить. Вместо:

$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'));
74
ответ дан 27 November 2019 в 01:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: