2012-04-15 4 views
9

私は単純な使用例があります。私は私のモックオブジェクトは、デフォルト値を返すようになりますsetUpメソッドがしたい:PHPUnit Mock後で期待を変更する

$this->myservice 
     ->expects($this->any()) 
     ->method('checkUniqueness') 
     ->will($this->returnValue(true)); 

をしかし、その後一部のテストでは、私は別の値を返すようにしたい:

$this->myservice 
     ->expects($this->exactly(1)) 
     ->method('checkUniqueness') 
     ->will($this->returnValue(false)); 

私は以前はGoogleMock for C++を使っていましたが、それには "returnByDefault"やそれを扱うものがありました。私はこれがPHPUnitで可能かどうかわかりませんでした(apiドキュメンテーションはなく、コードは私が探したいものを見つけるために読むのが難しいです)。

$this->myserviceを新しい模擬に変更することはできません。セットアップでは、模擬やテストが必要な他のものに渡すためです。

私の唯一の解決策は、私がセットアップの利点を失う代わりに、すべてのテストのために私のすべてのモックを構築しなければならないということです。

答えて

2

setUp()コードをパラメータを持つ別のメソッドに移動できます。このメソッドはsetUp()から呼び出され、テストメソッドからも呼び出すことができますが、デフォルトのメソッドとは異なるパラメーターが使用されています。

+1

この問題をどうやって解決できますか?とにかく 'setUp()'メソッドは呼び出されます。 –

+0

@MassimilianoArioneはい、あなたは '$ this-> myservice'を再作成して戻り値を変更することができます – rndstr

0

setUp()でモックを構築し続けますが、それぞれの試験で別々に期待を設定します。

class FooTest extends PHPUnit_Framework_TestCase { 
    private $myservice; 
    private $foo; 
    public function setUp(){ 
    $this->myService = $this->getMockBuilder('myservice')->getMock(); 
    $this->foo = new Foo($this->myService); 
    } 


    public function testUniqueThing(){ 
    $this->myservice 
     ->expects($this->any()) 
     ->method('checkUniqueness') 
     ->will($this->returnValue(true)); 

    $this->assertEqual('baz', $this->foo->calculateTheThing()); 
    } 

    public function testNonUniqueThing(){ 
    $this->myservice 
     ->expects($this->any()) 
     ->method('checkUniqueness') 
     ->will($this->returnValue(false)); 

    $this->assertEqual('bar', $this->foo->calculateTheThing()); 

    } 


} 

PHPUnitのは、各テストを実行するFooTestの新しいインスタンスをインスタンス化するため、2つの期待が互いに干渉しないであろう。

関連する問題