2011-10-18 3 views
4

나는 내 모든 테스트에서 조롱 개체를 갖고 싶어, 그래서 setUpBeforeClass() 메소드를 만들려고하지만, getMockBuilder는 다음과 같이 정적으로 호출 할 수있다, 그래서이 방법은 정적 :phpunit의 setUpBeforeClass 메소드에서 조롱 된 객체를 만드는 방법은 무엇입니까?

public static function setUpBeforeClass() { 

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

} 

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

조롱 개체가 setUpBeforeClass 방법에 내장 또는 나는 공공 기능 설정에서 테스트 (전에 매번 구축해야 할 수있는 어떤 기회가 : 문제는 getMockBuilder 정적으로 호출 할 수 없다는 것입니다() 방법)?

+0

왜 거기에 모의가 필요합니까? 정규 설치 방법이나 테스트에서 설정하지 않으셨습니까? 모의에 대한 기대치를 세우려한다면, 한 번만 만들어지기를 원하지는 않습니다. – Gordon

+0

mocked_object의 메서드는 항상 동일한 결과를 반환하므로, 한 번만 인스턴스화하는 것이 더 효과적이라고 생각한 이유입니다. 어쨌든 setup 메서드에서 만들 수는 있지만 setUpBeforeClass에서 만들 수 있는지 알고 싶습니다. 너무. –

+2

가능한지 확실하지 않지만 격리를위한 각 테스트마다 깨끗한 [스텁] (http://www.martinfowler.com/articles/mocksArentStubs.html#TheDifferenceBetweenMocksAndStubs)을 원하기 때문에 나쁜 습관을 주장합니다. – Gordon

답변

4

각 모의 객체는 그것을 만든 테스트 케이스 인스턴스에 묶여있다. 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')); 
    } 
} 
관련 문제