オーバーロードされた__get($ index)メソッドを欺くことに問題があります。 クラスが嘲笑されるためのコードと、次のようにそれは消費テスト対象システム:PHPUnit:__get()を偽装すると、 "__get()は1つの引数をとる必要があります..."
<?php
class ToBeMocked
{
protected $vars = array();
public function __get($index)
{
if (isset($this->vars[$index])) {
return $this->vars[$index];
} else {
return NULL;
}
}
}
class SUTclass
{
protected $mocky;
public function __construct(ToBeMocked $mocky)
{
$this->mocky = $mocky;
}
public function getSnack()
{
return $this->mocky->snack;
}
}
次のようにテストになります。
<?php
class GetSnackTest extends PHPUnit_Framework_TestCase
{
protected $stub;
protected $sut;
public function setUp()
{
$mock = $this->getMockBuilder('ToBeMocked')
->setMethods(array('__get')
->getMock();
$sut = new SUTclass($mock);
}
/**
* @test
*/
public function shouldReturnSnickers()
{
$this->mock->expects($this->once())
->method('__get')
->will($this->returnValue('snickers');
$this->assertEquals('snickers', $this->sut->getSnack());
}
}
実際のコードは、しかし、少し複雑ですそれほど親クラスに「getSnacks()」を持っていません。しかし、この例で十分です。
Fatal error: Method Mock_ToBeMocked_12345672f::__get() must take exactly 1 argument in /usr/share/php/PHPUnit/Framework/MockObject/Generator.php(231)
私は、私もテスト方法に到達できないデバッグする場合:
問題はPHPUnitでテストを実行するとき、私は、次のエラーを取得するです。それは模擬オブジェクトを設定する際に壊れているようです。
アイデア?
さて、もう少しテストしました。問題は本当に嘲笑されたクラスの建設にあるようです。 - > setMethods(array( 'blabla'))で作成すると、彼はテストメソッドを取得します。 - > setMethods(array( '__ get'))を使うと、彼は壊れます。 – beToiba
あなたは正しいです - 問題は、PHPモックオブジェクトが模擬を生成する方法と関係しています。 PHPUnit 4.0でこの問題が発生しています - どのバージョンを使用していますか? – HorusKol
私はこれをPHPUnitのさまざまな組み合わせで再作成しようとしました。最新のバージョン(執筆時には4.8.2)からPHPUnit 3.5に戻ってMock Objectの依存関係があり、この方法で壊れるようなことはありません。環境 - Ubuntu 12.04.5 LTS上のPHP 5.5。元のポスターが、使用していたバージョンの組み合わせを覚えてこの質問に展開できない限り、私はこの質問をクローズすることをお勧めします。 – Benjamin