我覺得BCAT給了一個很好的答案,但我想闡述的是他暗示
在現實世界中的特殊情況,事情並不總是那麼清晰,並具有 單元測試類可能是可接受的,或者甚至是可取的,它測試的類可能是 的朋友。
我在一家擁有大量遺留代碼庫的公司工作,這有兩個問題,這兩個問題都有助於進行朋友單元測試。
- 我們忍受着大量需要重構的大型函數和類,但爲了重構它,有助於進行測試。
- 我們的許多代碼都依賴於數據庫訪問,由於各種原因,不應將其引入單元測試。
在某些情況下,嘲諷是減輕後者的問題是有用的,但很多時候這只是導致uneccessarily複雜的設計(其中,否則將需要none類heirarchies),而人們可以非常簡單地重構代碼,在以下方式:
class Foo{
public:
some_db_accessing_method(){
// some line(s) of code with db dependance.
// a bunch of code which is the real meat of the function
// maybe a little more db access.
}
}
現在我們有了函數的肉需要重構的情況,所以我們想要一個單元測試。它不應該公開暴露。現在,在這種情況下可以使用一種稱爲嘲笑的美妙技術,但事實是,在這種情況下,模擬是矯枉過正的。這需要我用不必要的層面來增加設計的複雜性。
一個更爲務實的做法是做這樣的事情:
class Foo{
public:
some_db_accessing_method(){
// db code as before
unit_testable_meat(data_we_got_from_db);
// maybe more db code.
}
private:
unit_testable_meat(...);
}
後者給了我所有的我從單元測試所需要的利益,包括給我寶貴的安全網,捕捉時產生的錯誤我重構了肉中的代碼。爲了進行單元測試,我必須要有一個UnitTest類的朋友,但我強烈認爲,這比一個無用的代碼規範要好得多,只是爲了讓我使用Mock。
我認爲這應該成爲一個成語,我認爲這是一個合適的,實用的解決方案來提高單元測試的投資回報率。
我想知道,如果他們也推出了一些替代方案? – 2010-11-13 06:36:43
替代方法找到了一種方法來調用使用公共接口的方法;使其受到保護並擴大課程範圍; – cchampion 2010-11-13 06:38:46
不想讓測試緊密耦合到它測試的代碼看起來好像意圖出錯了。 「正常」代碼之間的緊密耦合通常是要避免的,但測試將與他們按定義測試的代碼結合使用。 – 2010-11-13 06:58:07