2009-10-19 64 views
1

我有一個名爲FooJob()的類,它在WCF Windows服務上運行。這個類只有2個公共方法,構造函數和一個Run()方法。僅測試中型課堂上的公共方法?

當客戶打電話給我服務,昏暗的作業類的新實例,傳遞一些參數的構造函數,然後調用運行()...

的run()將採取的參數,做一些邏輯,發送(實時)請求外部數據供應商,採取的應對,做一些業務邏輯,然後把它在數據庫中...

是否明智只寫一個單元測試,然後(如果甚至可能)在Run()函數中?或者我會在這裏結束自殺嗎?在這種情況下,我應該鑽入私有函數並單元測試FooJob()類的函數嗎?但是,那麼這會不會「破壞」TDD中一些人認爲的「唯一測試行爲」/公共接口範例?

我意識到這可能是一個含糊不清的問題,但在正確的方向有什麼建議/指導或點,將不勝感激。

Drew

回答

2

做一些邏輯,發送(實時)請求外部數據供應商,採取的應對,做一些業務邏輯,然後把它在數據庫

這裏的問題是,你已經列出您的班級有多重責任......要真正進行單元測試,您需要遵守單一責任原則。您需要將這些職責分解到不同的界面中。然後,您可以單獨測試這些接口的實現(作爲單位)。如果你發現你不能輕易地測試你的課程正在做什麼,那麼另一個班級應該可以做到這一點。

好像你至少需要如下:

  1. 爲您的業務邏輯的接口。
  2. 定義請求到外部供應商的接口。
  3. 數據存儲庫的接口。

然後,您可以測試業務邏輯,與外部供應商進行通信的過程以及單獨保存到數據庫的過程。然後,您可以嘲笑這些接口來測試您的Run()方法,只需確保按照您的預期調用這些方法即可。

爲了做到這一點,理想的是將類的依賴關係(上面定義的接口)傳遞給它的構造函數(即依賴注入),但那是另一回事。

+0

謝謝......但我有一個問題 - 我們在什麼時候過度設計和構建太多的類,何時我們可以單元測試一些私有函數?這裏有什麼一般的經驗法則嗎?只要去你的腸道...? – dferraro 2009-10-20 13:55:18

+0

我建議看看面向對象設計的固體原則(http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod),其中單一責任原則是其中之一。我也儘量不考慮把事情分解成多個類來過度工程,因爲每個類都變得更簡單和更容易理解。我會說「如果你覺得需要單獨測試一個私人方法,那麼它應該是另一個班級」,這將是一個經驗法則,以及我上面所說的必須列出課程責任的內容。 – ColinD 2009-10-20 15:59:48

+0

我把課程分開,直到不能再分開爲止。如果您避免返回值,並將類看作是將消息發送給另一個,則這變得更容易概念化。微類具有非常容易理解的好處,以及添加新行爲通常是通過添加更多類來完成的,這意味着您可以單獨保留現有的經過測試的代碼。這是好事。 – kyoryu 2009-12-03 05:42:51

1

簡單的答案是 - 它取決於。我寫了很多單元測試來測試私有方法的行爲;我已經這樣做了,所以我可以很高興我已經涵蓋了針對這些方法的各種輸入和場景。

現在,很多人都認爲測試私有方法是一個壞主意,因爲它是公共方法這一問題。我明白了這個想法,但就我而言,這些私人調用的公共方法也只是一個簡單的Run()方法。私有方法的邏輯包括讀取配置文件並在文件系統上執行任務,所有這些都在「幕後」進行。

如果我剛剛創建一個單元測試,所謂的run()的話,我會覺得我的測試是不完整的。我使用MSTest爲我的類創建訪問器,以便我可以調用私有方法並創建各種場景(例如,當磁盤空間不足時發生的情況等)。

我想這是每一個自己的這種私有方法的測試做/或不做的說法。我的建議是,如果你覺得你的測試不完整,換句話說,需要更多的覆蓋,那麼我建議測試私有方法。

2

我的建議是讓你測試你的代碼的設計幫助。如果你努力執行語句或函數,那麼你的班級做得太多了。遵循單一責任原則,添加一些接口(允許你模擬出複雜的東西),甚至可以閱讀福勒的「重構」或羽毛的「使用遺留代碼」,這些教導我更多地瞭解TDD,而不是其他任何書籍。

1

這聽起來像你的跑步方法試圖做太多,我會分開它,但如果你是整體設計不會允許它。

我會考慮讓內部成員受保護,然後從測試類中的類繼承來測試它們。要小心,儘管我遇到過這樣的問題,因爲它不會重置類的狀態,所以Setup和TearDown方法是必不可少的。

0

感謝大家的意見。我相信你是對的 - 我需要分出更多的單獨課程。這是我使用真TDD的第一個項目之一,因爲我根本沒有上課設計,只是寫存根代碼......我得承認,我喜歡寫這樣的代碼,事實上我可以證明我的理由與多年的備份成功結果mangagment是純粹friggin真棒=)。

我唯一的缺點是過度工程和飽受類膨脹的困擾,當我可以對我的私有方法編寫單元測試時......我想常識和程序員必須在這裏使用...?