2013-07-05 33 views
5

我對單元測試比較新,對C#很新,但我一直在嘗試使用靜態方法來測試靜態類的代碼,而且好像我有編寫大量的樣板代碼以便測試,那麼代碼也可能需要測試。在C#.NET中測試靜態類和方法

例如:我正在使用System.Web.Security.Membership類,其上有一個方法ValidateUser。看起來我需要創建一個包含方法ValidateUser的接口IMembership,然後創建一個類MembershipWrapper,該類實現IMembership,實現方法ValidateUser並將參數傳遞給實際的Membership類。然後我需要在我的類上使用Membership來引用包裝器的屬性,以便在測試期間爲模擬對象注入依賴項。

因此,要測試使用Membership的一行代碼,我必須創建一個接口和一個類,然後將屬性和構造函數代碼添加到我的類中。這似乎是錯誤的,所以我一定會出錯。我應該怎麼做這個測試?我簡要介紹了一些依賴注入的框架/庫,但它們似乎仍然需要大量的樣板,或者對底層的情況有深入的瞭解。

回答

3

我沒有看到讓系統鬆散耦合的任何錯誤。我相信你不會抱怨創建構造函數參數並將抽象依賴關係傳遞給你的類。但是實例化依賴關係看起來非常容易,是嗎?

此外,正如我在評論中指出的,您可以稍後重新使用包裝。所以,從乍看起來,這不是無用的工作。

+0

我所有的做我的代碼鬆散耦合,和依賴注入似乎想做到這一點。看起來如果對於每個應用程序來說這麼基本和重要的東西需要這樣多的樣板代碼,它將會被解決,但是我找不到任何看起來像是真正解決了問題的東西。 – danpalmer

+0

@danpalmer實際上你可以使用類似於TypeMock的東西來模擬靜態方法,但是這不會讓你的代碼鬆散耦合 –

+0

是的,TypeMock並不是真正的選擇,因爲它是付費軟件,我堅持開源的東西正如我可以在這一點上。但謝謝你的建議。 – danpalmer

3

你是對的,認爲你沒有測試單行代碼,在這種情況下,你正在編寫重要的測試,以確保你的代碼以正確的方式與成員提供者交互,這不是簡單的單元測試而是「基於模擬」的集成測試。我認爲值得創建所有這些模擬,並通過測試這部分應用程序覆蓋。

是的,它似乎矯枉過正,但沒有其他方式 - 無論是使用一些助手/庫自己包裝第三方靜態依賴關係。

0

我你不快樂的同時構造器注入的方式,你可以看看使用Ambient Context

你基本上建立一個默認它將調用System.Web.Security.Membership.ValidateUser

你然後調用上下文暴露的方法在你的代碼中,你現在可以嘲笑它的測試

這使您可以編寫更少的設置代碼,但它也隱藏了事實,你有一個依賴項,這可能是未來的問題(取決於你如何're reusing code)

0

如果您使用VS2012,您可以隨時在Microsoft Fakes中使用Shims進行靜態調用(或者.Net庫調用)。

http://msdn.microsoft.com/en-us/library/hh549175(v=vs.110).aspx

http://msdn.microsoft.com/en-us/library/hh549176.aspx

+0

我遇到這些問題的原因是因爲我正在從假貨遷移。我不能依賴於花費如此之多的IDE。 – danpalmer

+0

@danpalmer好吧,像這樣的限制沒有暗示在你的問題。也就是說,VS2012 Express是免費的。 – Gjeltema

+0

根據功能比較頁面,「假貨」框架僅在Premium和Ultimate中可用。 – danpalmer