web-dev-qa-db-ja.com

PHPUnitモックオブジェクトとメソッドタイプのヒント

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を使用しています

42
Michael Dowling

更新

ああ、実際には、問題は非常に単純ですが、どういうわけか見つけるのは難しいです。の代わりに:

_$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'));
_
75
Ionuț G. Stan