當前正在閱讀Roy Osherove的「單元測試的藝術」。我大概過了一半,到目前爲止這是一本很棒的書。我要請大家離開這個討論中的IOC集裝箱。他只是簡單地提到他們(實際上國家奧委會超出了我不瞭解的這本書的範圍,並且是我批評這本書的少數幾個地方之一)。無論如何,國際奧委會拋開各種技術:依賴打破技術使用依賴關係Inj進行單元測試
- 構造器注入
- 物業注射
- 軟件工廠和靜
- 軟件工廠和虛擬方法
- 方法注入
- 列表項
好的,我會介紹一下我的東西不喜歡上面的每種方法。
1. 構造函數注入 - 使對象初始化變得困惑和困難,特別是如果您必須傳遞大量依賴關係。
2. 物業注入 - 羅伊似乎喜歡這種技術,但它是我最不喜歡的。如果你有一堆依賴關係,那麼用戶必須記得初始化這個類所需的每一個依賴關係。我會說這是容易出錯和混亂的。使課堂非常難以初始化不熟悉它的人。
3. 軟件工廠和靜力學 - 雖然我不認爲是壞的技術,我不喜歡依賴狀態。我喜歡處理完全無狀態的對象,但到目前爲止,我認爲它是最好的技術。
4. 軟件工廠和虛擬方法 - 類似於上述技術,但允許您從類繼承,並且只覆蓋設置依賴項並將其更改爲存根的函數。我的想法與3相似 - 對於試圖找出單元測試失敗原因的人來說,它有點讓人感到困惑。
5. 方法注入 - 我只能說ewwwwwww ...傳遞每個你調用的方法的每一個依賴。說夠了。
我想到了另一種我比上面列出的每種方法都更喜歡的方式。我通常不會鼓勵有條件的編譯,但我認爲在少數幾個輕鬆使用它的地方,它可能是有道理的。我的建議是標準化一個方法的名稱,爲你的測試設置你的依賴關係。例如:
.InitalizeDepForTesting(IFileSystem file, IDatabase data, IEventLog event, ...)
然後包裹上面的語句在條件編譯聲明:
#If DEBUG
public void InitializeDepForTesting(...)
#endIf
所以內部的依賴繼續工作的是,不需要改變。你也可以避免把構造函數弄糟,並把所有的依賴關係傳給一堆其他的「東西」。就生產代碼而言,沒有任何變化,一眼就可以很容易地看到如何初始化對象以進行測試。你們都在想什麼?
如果你真的拼寫出所有的單詞,你的問題會更容易閱讀。例如:「條件補償」。什麼是「comp」?計算?彙編?還有別的嗎? – 2010-03-09 19:19:01
好吧我會做一些編輯 – coding4fun 2010-03-09 19:22:06