我正在使用一個DI容器,我想對容器中已解析的實例進行MSTest(VS 2010)單元測試。MSTest TestMethod依賴注入
我想將這些實例注入到我的TestMethod或至少我的TestClass中。這可能嗎?
現在我的TestMethods直接調用container.Resolve<T>(xxx)
,我寧願避免使注射測試更真實。
任何人都有這方面的經驗?
在此先感謝。
我正在使用一個DI容器,我想對容器中已解析的實例進行MSTest(VS 2010)單元測試。MSTest TestMethod依賴注入
我想將這些實例注入到我的TestMethod或至少我的TestClass中。這可能嗎?
現在我的TestMethods直接調用container.Resolve<T>(xxx)
,我寧願避免使注射測試更真實。
任何人都有這方面的經驗?
在此先感謝。
測試類的實例化發生在MSTest框架的內部類中,因此將相關性注入到它中將是一項具有挑戰性的任務。
主要原因 - 對於我來說,根據依賴注入模式編寫代碼並使用IoC框架來獲取可測試的代碼。然而,在測試代碼中使用IoC容器會得到相反的結果。從你的問題我可以看出你已經遇到了這個問題。
當使用服務定位器(SL)模式而不是依賴注入(DI)模式時,這尤其是問題。使用SL模式,類直接調用IoC容器(或這種容器的抽象),而不是爲類提供所需的依賴(使用構造函數注入)。由於類直接調用容器,因此您還需要在測試環境中配置該容器。這很痛苦,因爲測試配置或虛假對象通常變得非常複雜,因爲您經常希望在每個測試的基礎上影響虛假行爲,同時保持線程安全,因爲測試框架可能並行運行測試( MSTest做到這一點)。我知道我在過去寫過一些瘋狂的線程安全測試代碼,然後才發現我做的都是錯的:-(。
所以你應該在應用程序代碼中使用DI模式,並在測試中使用應該手動連接這些依賴關係,例如,當測試類別爲ICustomerService
的HomeController
類時,通常應在測試類中使用CreateController()
或CreateValidController
工廠方法,以集中創建HomeController
。在測試代碼中編寫這些依賴關係,從而在測試代碼中創建維護噩夢。在這種工廠方法中,您手動注入例如FakeCustomerService
類,執行如下操作:
private static HomeController CreateController(
InMemoryDataMapper mapper)
{
var uowFactory = new FakeNorthwindUnitOfWorkFactory()
{
UnitOfWork = new NorthwindUnitOfWork(mapper);
};
return new HomeController(new FakeCustomerService(uowFactory));
}
這樣的工廠方法看起來當然取決於(不打算打算)HomeController
的依賴關係結構的外觀。簡而言之,不要試圖在您的測試代碼中執行依賴注入,就像您希望在應用程序代碼中執行的操作一樣。測試框架不僅難以做到這一點,而且意味着您必須爲您的測試環境配置您的IoC框架,在這種情況下您將面臨失敗。不幸的是,我從經驗談起。
我沒有使用SL模式,幸運的是......只有構造函數注入。我想我記得在並行測試中使用google搜索,因爲我有同樣的擔憂,並且看到默認情況下MSBuild不會並行運行測試,但我可能是錯誤的。 – Jeff 2010-11-24 19:03:16