2013-08-16 29 views
3

我正在使用Visual Studio 2010編寫C#項目,但想要使用NUnit進行單元測試。隱藏類 - 但無法進行單元測試

我對oop相當陌生,但是試圖儘可能地利用信息隱藏和暴露只需要最少的接口。這意味着我有一對完全在圖書館內部的類 - 它們可以處理一些內部狀態,而用戶只需要知道幾個提供界面的公共類。

這似乎儘可能地隱藏起來,爲用戶提供最小的接口。

但是,如果我想單元測試,我看不到一種方法來測試這些類。所以我的問題是什麼是最佳實踐?不得不純粹爲了單元測試而暴露他們似乎是一種恥辱......或者是否有更好的工具來工作?

在儘可能多的封裝和儘可能多的方法之間進行權衡以允許它們全部進行測試 - 在單元測試中最好測試內部工作並讓集成測試測試公衆接口?

-

我意識到,通常情況下,你只會擔心單元測試的公共接口,但在這種情況下,這將導致很多非常令人費解的測試 - 這肯定是更好地擁有一切打破分成小塊來測試?

回答

5

我不會去討論是否有意義測試內部類或沒有,但你想要的東西可以用InternalsVisibleTo屬性

添加可以實現以下到您的庫:

[assembly:InternalsVisibleTo("MyTest")] 

和所有內部課程將可從MyTest.dll

+0

謝謝,這似乎是一個良好的開始測試。不過,如果有人對封裝和可測試性之間的平衡有任何反饋,我會非常感興趣! – Mark

+0

我的0.02美元:我有一個實用的方法來測試 - 如果它足夠複雜,它會受益於測試,我測試它,不管它是公共還是內部。如果稍後再更改它,我會更新/刪除測試 - 我已經多次更改/刪除公共類,因此我沒有看到該參數有效。國際海事組織(IMO),通過公共API測試所有內容不是單元測試(就像@Vorac在他的回答中正確指出的那樣),但將這個問題放在一邊,我更喜歡儘可能靠近UUT進行測試,以簡化設置代碼並避免產生誤報從其他一些組件被破壞。 –

+0

謝謝您的確認。這是我的想法。 – Mark

0

也許我誤解你的情況,或者什麼單位測試它。隨心所欲地閱讀。加上指導我評論什麼是確切的問題。

測試API絕不是單元測試 - 它被稱爲system test

單元測試需要單元,例如,一個班級,一次一個模式,一個班級的環境。然後斷言它的行爲正確。對於你的私人課程,「環境」是圖書館的其餘部分。

爲了測試的目的,不應公開私有數據。這是爲什麼。私有數據是實現特定的。也就是說,數據格式應該能夠自由改變,而不需要類API或單元測試用戶的注意。

This guy說明比我好。

+0

這正是我的想法 - 黑盒測試(只有公共部分)比單元測試更接近系統測試,它應該測試內部工作(白盒)。這是我的問題,直到它被解釋爲可以使用InternalsVisibleTo屬性測試內部。然而,現在看起來很多人都認爲你不應該將這些私人部分暴露給單元測試。 – Mark