2013-07-19 115 views
5

我想追溯單元測試一個相當複雜但利用MVC的應用程序。我知道追溯應用單元測試並不理想,但我仍然相信通過重構現有代碼是可能的。大多數時候不可能單元測試一個單元,而不依賴於其他單元,即視圖依賴於模型。當單元測試依賴於其他單元時,單元測試如何進行模塊化?

這種情況下單元測試的最佳方法是什麼?利用真實模型還是創建模擬模型會更好?

與利用我的情況真實模型的問題是,該模型依賴於從XML獲得數據,所以有依賴鏈其他響應類別。這個模型有很多數據,所以使用它會容易得多,但也許我錯過了這一點。

我已經提供了簡潔的應用程序的UML。

enter image description here

**編輯****

好了,所以如果我是正確的,是它的模擬類中創建模擬數據的最佳實踐?比如我有模擬類「MockPlaylistPanelModel」創建要無差錯地運行所需的View類「PlaylistPanel」的數據:

class MockPlaylistPanelModel extends Mock implements IPlaylistPanelModel 
{ 
    /** 
    * Return all playlist items 
    * @public 
    */ 
    public function get mainPlaylistItems():Vector.<PlaylistData> 
    { 
    var playData:Vector.<PlaylistData> = new Vector.<PlaylistData>; 
    var playlistResp:PlaylistData = new PlaylistData(0, "", "", 0, 0, 0, 0); 
    playData.push(playlistResp); 
    return playData; 
    } 

} 

回答

6

要回顧性地將單元測試整合到現有應用程序中,通常需要更改應用程序代碼以支持單元測試(正如您正確地提到您可能需要執行一些重構)。然而,當然這裏面的風險是應用程序引入bug的變化,如果沒有進行一些測試,這些bug是無法保護的。

因此,一個明智的方法是獲得一些覆蓋您的一些關鍵用例的系統級測試。這充當了應用程序中的一種「測試腳手架」,這意味着您可以更安全地開始引入較低級別的測試,並在修改應用程序以使其更易於測試時降低引入錯誤的風險。一旦實施完成後,您就可以制定一項政策,即開發人員必須針對其更改之前所更改的任何代碼編寫測試 - 這樣您可以在應用程序周圍有機地生成一套自動化測試。

我強烈建議您掌握Working Effectively with Legacy Code - 這本優秀的書籍涵蓋了將測試引入到現有的應用程序中的各種有用的技術,這些應用程序幾乎沒有自動化測試。

關於您是否應該創建一個模擬類的內部模擬數據進行測試你的問題,這是注射對象的測試版本時,你可以採取一個辦法,但可能不是最好的。通過使用模擬框架像Mockito您可以輕鬆地創建與上飛明確規定的行爲模仿對象。你的情況,你可以使用到的Mockito創建一個模擬模型實現,然後注入你的模擬模型到任何對象依賴於它。

+0

+1這本書的參考,爲+1的Mockito,一爲一個很好的答案 - 太糟糕了,我只能投票一次... – weltraumpirat

0

他們沒有單元測試;他們是集成測試。

是的,使用模擬來隔離單元測試的類。

0

單元測試只能測試程序的一部分。如果您使用其他部件,則會成爲集成測試。

一個集成測試,檢查該部分很好地協同工作,而不是做他們必須做什麼。

的單元測試,檢查該部分做它必須做什麼。

這兩個測試之間的區別。

重構的單元測試,你可以找設計模式依賴注入。