2009-10-26 37 views
0

簡短問題:有沒有辦法在SimpleTest中重置Mock對象,刪除所有期望?SimpleTest模擬對象:清除期望

的更詳細的解釋:

我有我使用SimpleTest測試和時遇到一些問題,它使用的是模擬對象的類。

該類別爲Logger,記錄器內部有多個Writer對象(FileWriter,EmailWriter等)。調用Logger::log()方法在幕後執行一些邏輯並將消息發送給正確的作者。編寫者被緩存在Logger類中以保存每次重新實例化每一個。

在我的單元測試中,我設置了一個Logger,創建並添加了一些Mock Writer對象,然後一直使用MockDBWriter->expectOnce()等方法來測試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. 

我懷疑緩存作家的智慧,以節省重新實例化。如果你實例化一個廉價的操作(即不要創建數據庫連接或任何東西),並推遲這種事情,直到你真正需要連接,比如第一個查詢,那麼你將不需要緩存,這可能會導致整個問題走開。

你可以做的另一件事是調用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); 
} 

與唯一的問題是,在年底tell()通話,這將導致SimpleMock::atTestEnd()來清點所望的時候被調用兩次。但是,你可以解決這個問題:

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

此答案是基於SimpleTest版本1.0.1。