Dot-Net

使用“朋友”聲明進行單元測試。餿主意?

  • October 4, 2017

[當然,問題不限於特定的“朋友”實現,儘管如果相關,請隨時指出實現細節]

閱讀未回答的問題,我偶然發現了這個InternalsVisibleTo屬性:

指定通常僅在目前程序集中可見的類型對另一個程序集可見。

MSDN上的C# Programming Guide有一節Friend Assemblies描述瞭如何使用屬性來允許對另一個程序集使用方法和類型。internal

我想知道使用它來創建一個“隱藏​​”介面來檢測庫以供單元測試程序集使用是否是一個好主意。它似乎在兩個方向上大量增加了耦合(在生產程序集中測試程式碼,在測試程式碼中對生產程序集的內部了解),但另一方面,它可能有助於創建細粒度的測試,而不會弄亂公共介面。

你在測試時使用友元聲明是什麼體驗?是你的銀彈,還是它開始了死亡行軍?

我已經廣泛使用了這種技術——這意味著我的單元測試可以測試程式碼庫中普通消費者看不到的方面。

雖然使用[InternalsVisibleTo]確實增加了耦合,但我相信(輕微的)增加是非常值得的。

我的單元測試已經與被測程式碼緊密耦合——儘管我嘗試編寫測試來確保特定的結果,而不是特定的實現,通過訪問普通消費者不可見的東西,我確實在某種程度上限制了實現。

換一種方式,耦合是最小的——在[InternalsVisibleTo]程式碼程序集中具有屬性,並將某些東西標記為內部而不是私有(或受保護的內部而不是受保護的)。

(請注意,我在這裡忽略了使用單元測試引發的任何設計更改,這是另一個完整的討論。)

[InternalsVisibleTo]屬性需要強命名您的程序集。如果您還沒有這樣做,您可能會發現這有點繁瑣,因為強命名程序集可能只依賴於其他強命名程序集,這最終可能導致您需要更改多個程序集。

獲得正確的屬性可能有點繁瑣,因為它需要包含測試程序集的公鑰。IDesign 有一個有用的Friend Assembly 工具,可以在剪貼板上創建屬性,準備粘貼。推薦的。

引用自:https://stackoverflow.com/questions/261177