2010-02-08 91 views
1

對於單元測試,您不應該測試私有方法,但是對於集成測試(使用像MSTest或NUnit這樣的單元測試框架),我非常希望對內部API調用測試網址,以確保當第三方API供應商更改其後端時當前的代碼工作。由於系統的複雜性(愚蠢的API有數百個參數),我已經將它的大部分隱藏在接口和IoC之後,其中API助手類完全在我們的數據層庫內部。我不想改變這個,因爲它曾經是公開的,我們發現這個奇怪的開發者對於這個項目來說是新手,一般來說沒有經驗的人會立即開始直接從網站代碼調用api。讓班級內部應該確保他們至少在摧毀我們的抽象層之前思考。集成測試私有類和方法

我一直在建立大量的反射代碼來獲取內部方法,但它工作得不太好,正在得到sphagetti-ish。有沒有辦法讓這些方法對某些庫公開顯示?有沒有辦法讓測試libray把自己當作包含api的庫的一部分?這是最佳做法嗎?

+0

根據您使用的語言不同,您可以設置庫類的可見性並從它們派生出一些測試。假設你使用了一個受保護的。 – 2010-02-08 22:43:23

+0

根據您提到的NUnit和MSTest,我在回答中假定您使用的是基於.net的語言,如果這不正確,它會對您有用,讓我們知道=) – Rob 2010-02-08 22:52:43

+0

.NET C#mix 3.5(用於測試)和2.0(用於圖層代碼),後者歸功於stage/uat/prod服務器的延遲升級。 – Aquinas 2010-02-08 23:37:29

回答

5

InternalsVisibleTo attribute這裏是你的朋友=)如果你把它放在AssemblyInfo.cs(至少這是我通常所說的地方)並指定你想公開內部方法的測試/其他程序集的名稱到,他們然後可用。額外的好處(至少在我看來)是,Visual Studio的intellisense系統/編譯器知道屬性及其用途,並且您將爲內部方法提供完整的智能感知。

與反射不同,只要您更改內部方法簽名,它不會因爲提供編譯時錯誤而可怕地中斷。

+0

謝謝,這工作的魅力。只要我謹慎使用它,它就能很好地符合我的代碼良知。唯一的不足之處是我的程序集全部簽名,這也要求我的測試程序集也要簽名以使用上述屬性。 – Aquinas 2010-02-08 23:53:53