PHPUnit模拟对象和方法types提示

我正在尝试使用PHPunit创build\ SplObserver的模拟对象,并将模拟对象附加到\ 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 

或多或less,这是代码:

 // 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

更新

哦,实际上,这个问题很简单,但不知何故难以发现。 代替:

 $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

原始答案

我认为你必须完全符合模拟的types:

 $observer = $this->getMock('\SplObserver', array('update'));