[英]How to set ASP.NET API with test in separate project to use one IoC/DI container
我對單元測試還很陌生,我很難做一件事。 我想在ASP.NET MVC中使用包含控制器測試方法的測試項目創建WebAPI。 我已經閱讀了很多有關IoC / DI的文章,並且已經在其他項目中使用了它,但是沒有用於單元測試。 作為IoC / DI的眾多優勢之一,經常提到針對測試方法的模擬類注入,但是我從來沒有找到一種方法來使用單獨的項目來實現。
因此,如何設置IoC / DI容器,使其既包含生產類又包含模擬類,但是當然,模擬類不會與生產代碼相互干擾,而是分別放置且僅在測試項目中可見?
簡短的答案,你沒有。
每個應用程序應具有其自己的合成根 。 由於單元測試與WebApi項目放置在單獨的項目中並且在單獨的過程中運行,因此它們是單獨的應用程序。 因此,它們將具有單獨的DI配置。 因此,簡而言之,1個可執行進程== 1個組成根。
DI是一種模式。 它不需要DI容器 。 因此,您的WebApi項目和單元測試項目都不需要DI容器。
盡管有些人喜歡在單元測試期間使用DI容器,但對我來說,這似乎有些過頭了。 單元測試是一次測試一個類 。 測試場景中的其余類都應該是存根或模擬 。 如果遵循良好的設計規范(不使用構造函數過度注入 ),則在一個場景中,您通常將不超過4個實例-被測試的類和最多3個偽類。 使用new
關鍵字創建這些實例不僅簡單,而且使單元測試更易於理解。 單元測試的一個重要方面是使它們易於理解,以便其他人可以很容易地看到正在測試的內容以及在文檔不清楚時如何使用它們來理解API。
在集成測試或用戶接受測試期間 ,您可能會考慮更認真地使用DI將組件組合在一起,因為在這種情況下,您通常需要一個以上的測試類來組合在一起。
首先,我完全同意@ NightOwl888,您不應在UT
使用IoC
容器,但是我看到一些項目將IoC
與系統代碼結合在一起,在這些情況下,很容易使用IoC
容器注入依賴項。
在單元測試中,您首先要模擬要驗證行為的條件,然后執行單元,然后驗證行為( AAA模式 )。 當您使用IoC
限制器時,通常使用與AAA
模式匹配的RRR模式 。
那么,如何設置IoC / DI容器,使其同時包含生產類和模擬類呢?
這有點取決於您使用的IoC
容器,但最底端的概念是相同的:
在“ Arrange
部分:
您解決了測試中的類(現在CUT
將您的偽造品作為依賴項...)
通常您應該在TearDown
釋放對象...
每個IoC
容器都允許您以不同的方式進行操作。 Autofac
使用最后一次注冊, Castle Windsor
具有IsDefualt
方法(還有更多方法可以進行城堡..),依此類推...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.