2012-06-19 34 views
3

在執行過程中作爲一個Asp.Net MVC應用程序,物業注射用autofac工作順利,如記錄在這裏:物業注射不是從單元測試工作屬性

http://code.google.com/p/autofac/wiki/Mvc3Integration#Filter_Attribute_Property_Injection

如果我貫徹這個相同的邏輯到(nunit)單元測試,這些屬性不會被注入到我的自定義屬性中。在mvc擴展中是否有特定的內容會導致它不能從單元測試中工作?

謝謝

+0

爲什麼你在單元測試中擔心DI?你可以直接從單元測試代碼中設置過濾器的依賴關係嗎? – VJAI

回答

2

您應該避免使用DI進行單元測試。單元測試是關於測試特定代碼的功能而不是其他測試。在你的情況下,如果你正在測試自定義屬性,那麼你應該直接設置依賴關係,而不依賴於任何IoC容器來做到這一點。

大多數情況下,依賴關係將被替換爲模擬對象而不是真實對象。

+0

個人而言,我更喜歡在自動化測試中使用我的DI容器,原因有幾個。然後我測試我的DI是否正確連接。 2.測試看起來更清潔,因爲它們專注於執行而不是構圖。 3.我通常更感興趣的是測試所有能正確工作的部件,而不是每部件都能正確工作。 –

+0

OP在說單元測試不是集成測試 – VJAI

+0

也許吧。當我聽到開發者說「單元測試」時,我認爲他們意味着更通用的「自動化測試」,而不是真正的單元測試。 –

3

過濾器屬性屬性注入作爲MVC/ASP.NET管道的一部分工作,而不是作爲獨立功能提供的某些東西。

您可能會注意到,MVC控制器上的過濾器實際上在單元測試期間也不會執行。例如,將HandleErrorAttribute放在控制器操作上,並在單元測試中拋出該操作的異常。請注意,HandleErrorAttribute未被調用以嘗試將您發送到錯誤視圖?

這是因爲在單元測試場景中,您不在MVC管道 - 您正在將控制器/操作測試爲POCO(普通舊CLR對象)。您不會獲得模型綁定,過濾器,HttpModules或其他任何您通常會看到的實際集成/執行的一部分。

這不是一個錯誤,這是設計。它與您可以單元測試WCF服務實現的方式類似,如果您通過web.config將行爲附加到它們,則不會在單元測試中看到這些行爲。你的單元測試沒有在管道中執行,它只能作爲獨立實體針對一個類執行。

如果您需要測試整個事情如何與過濾器一起,所有 - 集成測試 - 你需要考慮使用瀏覽器自動檢索從您的網絡應用程序的運行版本的內容或一些其他編程Web客戶端機制。爲了實現管道,您必須實際運行在完整的運行時,而不是在標準/獨立單元測試環境中運行。

至於是否可以在單元測試中使用DI ......這更多的是個人偏好。我在我的一些測試中使用它,但是當我這樣做時,我將mocks/stubs作爲依賴關係進行連接,以便可以控制我的受測系統與其依賴關係之間的交互。你不需要DI來做到這一點。您可以手動構建所有假依賴關係,並在沒有任何DI/IoC容器的情況下將它們戳入。也就是說,在單元測試環境中,你不應該連接真正的依賴關係,因爲那樣你就不會將你的類作爲一個單元進行測試 - 這是一個集成測試。