2010-03-23 51 views
1

我們幾個月進入一個綠色領域的項目來重新修改我們產品的邏輯層和業務層。通過利用MEF(依賴注入),我們實現了高水平的代碼覆蓋率,並且我相信我們擁有非常穩定的產品。當我們一直在研究一些更復雜的邏輯時,我發現它越來越難以進行單元測試。通過設計注意事項簡化測試,同時利用依賴注入

我們利用CompositionContainer來查詢這些複雜算法所需的類型。我的單元測試有時難以遵循,因爲必須進行漫長的模擬對象設置過程,恰到好處,以便確認某些情況。我的單元測試通常比我想測試的代碼花費更多的時間來編寫代碼。

我意識到這不僅是依賴注入的一個問題,而且是整個設計的問題。對於我過於複雜的測試來說,缺乏方法設計或缺乏構圖?我已經嘗試了基類分類測試,創建了常用的模擬對象,並確保儘可能地利用容器來緩解這個問題,但是我的測試總是很複雜且難以調試。有什麼提示可以讓你保持簡潔,可讀和有效的測試?

回答

7

我的主觀視點:

  • MEF看起來像一個非常好的插件框架;它的設計不是一個完整的DI框架。如果您不需要活動的可插拔組件,請調查full DI/IoC Container frameworksUnity是微軟的替代品。
  • 請確保您是而不是正在做Service Locator anti-pattern。儘可能使用接口的構造函數注入。請參閱great post by Mark Seemannthis one by Jimmy Bogard。你所說的「儘可能地利用容器」是一個值得關注的問題 - 很少有班級需要知道關於容器的任何東西什麼
  • 獲得一個非常好的嘲諷/隔離框架並學習如何使用它。我愛Moq。嘗試在被測系統上進行狀態驗證,而不是在模擬上儘可能進行行爲驗證。
  • 閱讀The Art of Unit Testing。閱讀有關單元測試的其他書籍和文章。練習TDD。保持學習。
  • 閱讀Clean Code並確保您的課程遵循SOLID原則(尤其是Single Responsibility Principle)。冗長的模擬設置是一種代碼味道;你的課程可能做得太多了。高代碼覆蓋率很好,但更好的指標可能是cyclomatic complexity
  • 不要擔心你的單元測試花費的時間比生產代碼要長。然而,像生產代碼那樣對待你的測試,並且在你保持可讀性和可維護性的時候刪除重複。
+1

你提出了很多好點。在閱讀關於Service Locator反模式的文章後,我強烈地感覺到,這正是我們正在做的,部分原因是我們正在經歷的一些問題。我創建了這麼多的類來讓代碼更「乾淨」。我認爲我們可能跳過了MEF的槍,反過來可能會被卡住。我將不得不思考,我們可以如何重新對它進行如此大的依賴。 Moq是我選擇的嘲諷框架,並且非常喜歡。我覺得在不久的將來會有很大的重構... – 2010-03-23 04:05:32

+0

@亞當 - 謝謝!至少你有測試來支持你的重構! :)在閱讀這本書時,我聽起來很霸道;我爲此道歉。聽起來像你在正確的軌道上。 – TrueWill 2010-03-23 14:43:03

+0

不用擔心。我不認爲這是高壓手段。乾杯! – 2010-03-23 15:51:33