2013-03-15 42 views
48

我想寫一個類庫爲我創建一個複雜的對象,但只應儘可能少地暴露。我希望它被包含到其他項目中,並且在那裏我只有一個對該庫的調用,例如,返回一個內部創建的類的對象。我不想讓別人明確地創建這些對象,但我仍然想爲這個類庫創建一個測試項目。如何測試內部類庫?

例如:

var result = Manager.Instance.Create(definition) 

這應該是對類庫的唯一通道。

根據定義參數,它使用不同的子類來創建請求的實例並相應地設置它的屬性。因此,我想通過測試以確保整個創建過程正常工作。但是因爲我也不想公開很少的結果對象的內部屬性,我不能通過使用這個公共訪問方法來測試,因爲我沒有任何屬性來斷言。

我知道你不應該測試內部機制,它通常是不好的設計,我也通過this article閱讀,但沒有任何辦法可以創建一個庫加單元測試項目,也許以後限制訪問這個班?用包裝什麼的?

+0

您使用的是哪種語言? – 2013-03-15 19:52:00

+0

Duplicate:http://stackoverflow.com/q/358196/492 – 2013-11-06 10:40:34

回答

123

在.NET中可以使用InternalsVisibleToAttribute在你的類庫,使您的內部類型可見你的單元測試項目。

這樣你可以保持你的課程內部,並仍然使用它從你授予訪問權限的其他程序集。

你使用這樣的:

[assembly:InternalsVisibleTo("NameOfYourUnitTestProject")] 
+0

不知道!謝謝! – 2013-03-16 11:30:03

+10

偉大的解決方案!一些額外的信息: 1)在此情況下'[組件:...]'語法不按門鈴:這些都是集屬性(http://msdn.microsoft.com/en-us/library/4w8c1y2s。 aspx),其中最着名的是'AssemblyVersionAttribute'及其兄弟。 2)您可以在項目中的任何.cs文件中使用這些文件,位於名稱空間之外,但通常在位於「屬性」項目文件夾中的'AssemblyInfo'文件中指定它們。 3)如果這些不同,你必須確定你的項目的*名稱*,而不是*名稱空間*。 – 2014-05-09 06:57:24

+0

太棒了,我不知道有人能做到這一點,你每天都會學到新的東西! – MaYaN 2016-01-19 11:20:32