2015-12-07 53 views
1

在我的.NET解決方案中,我有兩個項目:一個主項目和一個項目,用於對主項目運行測試。在我的項目中,我有幾種我想保持「私人」的方法,但也想運行測試。有沒有一種訪問方法可以將這些功能限制在我的解決方案中?是否有訪問修飾符限制解決方案?

+4

有人可能會爭辯說,你應該只測試你的公共API,但你可以使用internal和InternalsVisibleTo來讓測試項目看到它們。 – juharr

回答

6

您在尋找InternalsVisibleTo屬性。

通過該屬性,您可以指定其他應該可以訪問組件內部類型和方法的程序集。因此,在您的主項目AssemblyInfo.cs文件(或任何其他源文件),你可以指定你的測試項目是「朋友組裝」,應該有機會獲得您的主項目的內部:

​​

正如Alexei指出的那樣,如果您的MainProject使用強名稱鍵進行簽名,則任何「朋友」程序集也必須進行簽名。這是解釋here

雖然,如另一評論中所述。最佳做法是使用其公共API測試您的程序集。

+0

備註:由於強大的簽署要求,「InternalsVisibleTo」方法對許多人無效。 –

2

您可以使用InternalsVisibleTo屬性使類型和方法對所選程序集可見。

但是,您應該嘗試設計您的API,以便僅使用公共接口進行測試。

2

您應該認真回想一下您的解決方案的體系結構。這是一種常常表明你的班級同時做了太多事情的氣味。

一個簡單的解決方法是提取這種責任(這些私有方法)到另一個類,他們隨即成爲public和是可測試的開箱...

1

沒有,有沒有辦法來限制訪問「只是解決方案「。

原因是解決方案只是一組項目。一個項目可以有多種解決方案。因此,即使您「限制」了訪問一個解決方案中包含的項目,您/他人也可以創建另一個解決方案,以某種方式神奇地訪問方法。

另外構建的程序集不包含關於它是哪個解決方案的任何信息 - 所以在運行時沒有信息來檢查訪問。


對你特別的問題 - InternalsVisibleTo(如圖other answers)就可以訪問內部方法,你讓項目(需要強簽名的程序集)或重構你的代碼,以避免用於測試私有方法的需要。