2010-03-09 131 views
1

當前正在閱讀Roy Osherove的「單元測試的藝術」。我大概過了一半,到目前爲止這是一本很棒的書。我要請大家離開這個討論中的IOC集裝箱。他只是簡單地提到他們(實際上國家奧委會超出了我不瞭解的這本書的範圍,並且是我批評這本書的少數幾個地方之一)。無論如何,國際奧委會拋開各種技術:依賴打破技術使用依賴關係Inj進行單元測試

  1. 構造器注入
  2. 物業注射
  3. 軟件工廠和靜
  4. 軟件工廠和虛擬方法
  5. 方法注入
  6. 列表項

好的,我會介紹一下我的東西不喜歡上面的每種方法。
1. 構造函數注入 - 使對象初始化變得困惑和困難,特別是如果您必須傳遞大量依賴關係。
2. 物業注入 - 羅伊似乎喜歡這種技術,但它是我最不喜歡的。如果你有一堆依賴關係,那麼用戶必須記得初始化這個類所需的每一個依賴關係。我會說這是容易出錯和混亂的。使課堂非常難以初始化不熟悉它的人。
3. 軟件工廠和靜力學 - 雖然我不認爲是壞的技術,我不喜歡依賴狀態。我喜歡處理完全無狀態的對象,但到目前爲止,我認爲它是最好的技術。
4. 軟件工廠和虛擬方法 - 類似於上述技術,但允許您從類繼承,並且只覆蓋設置依賴項並將其更改爲存根的函數。我的想法與3相似 - 對於試圖找出單元測試失敗原因的人來說,它有點讓人感到困惑。
5. 方法注入 - 我只能說ewwwwwww ...傳遞每個你調用的方法的每一個依賴。說夠了。

我想到了另一種我比上面列出的每種方法都更喜歡的方式。我通常不會鼓勵有條件的編譯,但我認爲在少數幾個輕鬆使用它的地方,它可能是有道理的。我的建議是標準化一個方法的名稱,爲你的測試設置你的依賴關係。例如:

.InitalizeDepForTesting(IFileSystem file, IDatabase data, IEventLog event, ...) 

然後包裹上面的語句在條件編譯聲明:

#If DEBUG 
     public void InitializeDepForTesting(...) 
#endIf 

所以內部的依賴繼續工作的是,不需要改變。你也可以避免把構造函數弄糟,並把所有的依賴關係傳給一堆其他的「東西」。就生產代碼而言,沒有任何變化,一眼就可以很容易地看到如何初始化對象以進行測試。你們都在想什麼?

+1

如果你真的拼寫出所有的單詞,你的問題會更容易閱讀。例如:「條件補償」。什麼是「comp」?計算?彙編?還有別的嗎? – 2010-03-09 19:19:01

+1

好吧我會做一些編輯 – coding4fun 2010-03-09 19:22:06

回答

2

a。)我與PicoContainer人羣就此:ConstructorInjection是要走的路。清晰的語義和明確的執行。

b。)關於您的測試方法:我更喜歡使用Mocks,然後依靠IOC進行對象組裝。

4

施工注塑是更清晰的選擇,因爲它清楚地確定了你的依賴關係。如果它們太多且令人困惑,那可能表明您的設計存在問題。

+0

我想我想在棕色的情況下,當你試圖分解代碼,所以它可以進行測試,尤其是如果你的變化構造函數在很多地方使用。在某些情況下,這將是痛苦的。當然,如果你從一開始就設計代碼,應該很容易測試,但這不是很多次。對於我想出來的解決方案而言,這種改變是最小的。 – coding4fun 2010-03-09 19:28:19

+1

我同意這將是最小改變的解決方案,但我質疑測試最終如何有效。讓我們知道... – 2010-03-09 19:32:07

4

基於構造函數的注入似乎是社區中的明顯贏家(並且是我使用的唯一方法)。

你問IoC會從討論中刪除,但這就像要求我們討論用記事本編寫.Net代碼一樣。當然可以做,但你爲什麼想要?正確使用時,IoC容器通常允許您在運行時通過一次調用來構建整個應用程序。從這一點開始,您的所有實例都可以正確設置正確的依賴關係。這甚至沒有提到所有使用汽車模擬進行單元測試的工作。

正如別人指出,如果你有這麼多的依賴關係,你的構造函數令你感到困惑,那麼你真的需要重新考慮你的設計。在你讀完羅伊的優秀書籍後,我建議你拿起一本鮑勃叔叔的「清潔代碼」。

+1

採取點。只是試圖創造一個打破依賴於我還不是所有人都熟悉的東西:P。我理解這些概念,但這是關於它的。讀完這本書之後,可能會去玩構造圖。雅「清潔代碼」在我的名單上,還有一些其他人喜歡「有效地使用遺留代碼」(非常重要,我工作的地方)。 – coding4fun 2010-03-09 19:38:10

+1

@ user127954 - 你提到的兩本書都非常出色。 「有效地工作......」將涵蓋您在另一條評論中提出的問題(「當你試圖分解代碼以便測試時,這是一個棕色域的案例」)。 – TrueWill 2010-03-09 20:40:31

0

我打算要求所有人離開IOC 集裝箱。

通過這樣做會產生問題。 我理解你的推理,但是,全部如果你考慮適當的國際奧委會,你的異議將變得沒有意義。