2013-12-11 78 views
0

我有這種方法,我想單元測試。由於它在方法內部創建了Sql對象,我不能嘲笑它。如何對創建Zend Db Sql Sql對象的方法進行單元測試?

最初我想讓Sql成爲一個實例屬性,除了每當我在其他方法中使用它時都必須重置它,這很可能導致難以調試錯誤(我不想這種可能性如果可以避免的話,可以在其他後續調用getter時獲得一個「髒」的Sql對象)。

測試這些類型的方法的常見模式是什麼?

public function getConfigFromDb() 
{ 
    if (!is_null($this->configInDb)) { 
     return $this->configInDb; 
    } 

    $sql = new Sql($this->getSlaveDbAdapter()); 

    $select = $sql->select() 
        ->from('mytable'); 

    $statement = $sql->prepareStatementForSqlObject($select); 
    $results = $statement->execute(); 
    $results->buffer(); 

    $this->configInDb = $return; 

    return $results; 
} 
+0

在你的情況下,我會添加一個SqlFactory並將其註冊爲一個服務(在服務管理器配置中的工廠參數中),這樣你就可以輕鬆地模擬服務和從中獲得的對象。 – SmasherHell

+0

@SmasherHell你爲什麼發佈這個評論而不是答案?這看起來非常合理。 – Julian

回答

1

@Julian你是對的,我就會把它作爲一個答案

在這種情況下,我會(在服務管理器的配置在工廠PARAM)添加SqlFactory並將其註冊爲一個服務,這樣你就可以輕鬆地嘲笑服務和你將從中得到的對象。

爲了進一步探討這個問題,我將所有的對象創建委託給我可以使用ServiceManager調用的工廠。 事實是,我可以孤立地測試我的Factory,注入它需要的所有依賴關係,斷言創建的實際對象是預期的對象。無論何時,當我需要測試方法中Factory的一個對象時,我可以提供一個實例或一個Mock。

相關問題