2011-10-18 13 views
4

私はすべての私のテストで嘲笑のオブジェクトを持つようにしたいので、私はsetUpBeforeClass()メソッドでそれを作成しようとするが、getMockBuilderは次のようにスタティックにコールする必要があるので、このメソッドは静的である:phpunitのsetUpBeforeClassメソッドで擬似オブジェクトを作成するには?

public static function setUpBeforeClass() { 

    self::mocked_object = self::getMockBuilder('MockedClass') 
    ->disableOriginalConstructor() 
    ->getMock(); 

} 

問題はgetMockBuilderは、スタティックにコールすることができないということです。

Argument 1 passed to PHPUnit_Framework_MockObject_MockBuilder::__construct() must be an instance of PHPUnit_Framework_TestCase, null given 

は嘲笑オブジェクトがsetUpBeforeClass方法で構築することや、私が公共の機能設定で(テスト前に毎回を構築しなければならないの持っているすべてのチャンスがあります()メソッド)?

+0

なぜモックが必要ですか?あなたはちょうど通常のセットアップ方法やテストでそれを設定できませんか?モックの期待値を設定しようとしている場合は、それを一度だけ作成するのではなく、各テストごとに作成することをお勧めします。 – Gordon

+0

mocked_objectのメソッドは常に同じ結果を返すので、それを一度だけインスタンス化するほうがいいと思ったのはなぜですか...とにかく、セットアップメソッドで作成できましたが、setUpBeforeClassで作成できるかどうかを知りたいと思いますあまりにも。 –

+2

可能かどうかわかりませんが、分離のための各テストでクリーンな[スタブ](http://www.martinfowler.com/articles/mocksArentStubs.html#TheDifferenceBetweenMocksAndStubs)が必要なので、私は悪い習慣を主張しています。 – Gordon

答えて

4

各mockオブジェクトは、それを作成したテストケースインスタンスに関連付けられています。 setUpBeforeClass()は静的メソッドであるため、インスタンスを持たず、モックオブジェクトを作成できません。

代わりに、setUp()またはヘルパーメソッドでモックを作成し、それらをインスタンス変数に割り当てるか返すかのいずれかです。

class MyServiceTest extends PHPUnit_Framework_TestCase 
{ 
    function setUp() { 
     $this->connection = $this->getMock('MyDatabaseConnection', array('connect', ...)); 
     $this->connection 
       ->expects($this->once()) 
       ->method('connect'); 
    } 

    function testLogin() { 
     $this->connection 
       ->expects($this->once()) 
       ->method('login') 
       ->with('bob', 'p4ssw0rd'); 
     $service = new MyService($this->connection); 
     self::assertTrue($service->login('bob', 'p4ssw0rd')); 
    } 
}