2008-12-11 63 views
284

我是新的單元測試,我試圖弄清楚是否應該開始使用更多的「內部」訪問修飾符。我知道,如果我們使用'internal'並設置程序集變量'InternalsVisibleTo',我們可以測試我們不想從測試項目中公開聲明的函數。這使我認爲我應該總是使用'​​內部',因爲至少每個項目(應該?)都有自己的測試項目。你們可以告訴我爲什麼我不應該這樣做嗎?我應該何時使用'私人'?C#「內部」訪問修飾符做單元測試時

+0

值得一提 - 你可以通過在方法本身內使用System.Diagnostics.Debug.Assert()來經常避免單元測試你的內部方法。 – 2017-03-30 02:32:34

回答

867

內部類需要進行測試,並且有一個assemby屬性:

using System.Runtime.CompilerServices; 

[assembly:InternalsVisibleTo("MyTests")] 

這個添加到項目信息的文件,例如Properties\AssemblyInfo.cs

8

您也可以使用私有方法,您可以使用反射調用私有方法。如果您使用的是Visual Studio Team Suite,它具有一些很好的功能,可以生成代理來爲您調用私有方法。下面是演示如何做自己的單元測試private和protected方法的工作代碼項目的文章:

http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx

在其中的訪問修飾符,你應該使用方面,我的一般經驗法則是開始與私人並根據需要升級。這樣一來,您將盡可能少地暴露出真正需要的類的內部細節,並有助於將實現細節隱藏起來,因爲它們應該是。

93

如果要測試私有方法,請在Microsoft.VisualStudio.TestTools.UnitTesting命名空間中查看PrivateObjectPrivateType。他們圍繞必要的反射代碼提供易於使用的包裝。

文檔: PrivateTypePrivateObject

+6

當投下時請留下評論。謝謝。 – 2012-07-30 16:44:02

+26

這是愚蠢的投票下來這個答案。它指向一種新的解決方案,並且是以前沒有提到過的一個很好的解決方案 – 2012-09-06 07:43:13

8

繼續使用默認私人。如果一個成員不應該暴露在這種類型之外,那麼它就不應該暴露在這種類型之外,即使是在同一個項目中。這使得事情變得更加安全和整潔 - 當你使用這個對象的時候,更清楚你可以使用哪些方法。

話雖如此,我認爲有時候爲了測試目的而自然而私有的方法是合理的。我更喜歡使用反射,這是重構不友好的。

有一點要考慮可能是一個「ForTest」後綴:

internal void DoThisForTest(string name) 
{ 
    DoThis(name); 
} 

private void DoThis(string name) 
{ 
    // Real implementation 
} 

然後,當你使用同一個項目中的類,這是明顯的(現在和將來),你不應該真的在使用這種方法 - 它僅用於測試目的。這有點冒險,而不是我自己做的事情,但至少值得考慮。

+1

如果該方法是內部的,這是否不妨礙其在測試組件中的使用? – 2010-02-22 15:47:42