2009-10-26 3 views
0

간단한 질문 :모든 기대를 제거하고 SimpleTest에서 모의 ​​객체를 재설정하는 방법이 있습니까?SimpleTest 모의 객체 : 예상 지우기

긴 설명 :

나는 SimpleTest를 사용하여 테스트하고 있는데 그것을 사용하는 모의 객체 몇 가지 문제가 있습니다 클래스를 가지고있다.

클래스는 Logger이고 로커 내에는 Writer 개의 객체 (FileWriter, EmailWriter 등)가 있습니다. Logger::log() 메서드를 호출하면 장면 뒤에서 논리를 수행하고 메시지를 올바른 작성기로 라우팅합니다. 작성기는 Logger 클래스에 캐싱되어 매번 다시 인스턴스화하지 않습니다.

내 단위 테스트에서 Logger를 설정하고 모의 작성기 객체를 만들고 추가 한 다음 MockDBWriter->expectOnce()과 같은 메소드를 사용하여 Logger가 작동하는지 테스트합니다.

이제 문제는 Logger의 다른 기능을 테스트하려고하지만, expectOnce 기대치가 여전히 유효하고 후속 테스트가 실패하는 것입니다.

function testWritesMessageOK() { 
    $log = Logger::getInstance(); 
    $mock = new MockFileWriter($this); 

    $log->addWriter($mock); 

    $mock->expectOnce("write", "Message"); 

    $log->write("Message"); // OK 
} 

// this is just an example - the actual test is much less inane 
function testNumberOfWrites() { 
    $log = Logger::getInstance(); 
    $mock = $log->getWriter(); 

    $mock->expectCallCount('write', 2); 

    $log->write("One"); // fail - it doesn't match "Message" 
    $log->write("Two"); 
} 

모의 개체를 재설정하여 모든 기대치를 제거 할 수있는 방법이 있습니까?

답변

2

별도의 모의 인스턴스를 사용하십시오.

다음 중 하나를

$mock = $log->getWriter(); 
$mock = new $mock; 

또는 :

$mock = new MockFileWriter($this); 
// And then: 
$mock = new MockDBWriter($this); 
// And then: 
$mock = new MockEmailWriter($this); 
// etc. 

내가 다시 인스턴스화를 저장하는 캐시 작가의 지혜에 의문을 제기 것입니다. 인스턴스 생성을 저렴한 작업 (예 : DB 연결 또는 기타를 만들지 않음)으로 만들고 첫 번째 쿼리와 같이 실제로 연결이 필요할 때까지 연기하는 경우 캐시 할 필요가 없으며이 모든 문제는 가버 리다.

다른 방법으로 SimpleMock 생성자를 호출 할 수 있습니다. 이 모든 것을 할 것입니다

$mock = $log->getWriter(); 
$mock->SimpleMock(); 

:

/** 
* Creates an empty action list and expectation list. 
* All call counts are set to zero. 
* @access public 
*/ 
function SimpleMock() { 
    $this->_actions = &new SimpleCallSchedule(); 
    $this->_expectations = &new SimpleCallSchedule(); 
    $this->_call_counts = array(); 
    $this->_expected_counts = array(); 
    $this->_max_counts = array(); 
    $this->_expected_args = array(); 
    $this->_expected_args_at = array(); 
    $test = &$this->_getCurrentTestCase(); 
    $test->tell($this); 
} 

그 유일한 문제는 기대를 집계 할 때 SimpleMock::atTestEnd()의 원인이됩니다 끝에 tell() 전화가 두 번 호출 할 수 있다는 것입니다. 그러나 다음과 같이 수정할 수 있습니다.

// $this should == the test case in question 
array_pop($this->_observers); 

이 답변은 SimpleTest 버전 1.0.1을 기반으로합니다.