PHPunitを使用して\ 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
多かれ少なかれ、ここにコードがあります:
// 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およびPHPUnit3.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
に渡しました。
モックのタイプを完全に修飾する必要があると思います。
_$observer = $this->getMock('\SplObserver', array('update'));
_