2010-11-24 232 views
6

我正在使用一個DI容器,我想對容器中已解析的實例進行MSTest(VS 2010)單元測試。MSTest TestMethod依賴注入

我想將這些實例注入到我的TestMethod或至少我的TestClass中。這可能嗎?

現在我的TestMethods直接調用container.Resolve<T>(xxx),我寧願避免使注射測試更真實。

任何人都有這方面的經驗?

在此先感謝。

回答

6

測試類的實例化發生在MSTest框架的內部類中,因此將相關性注入到它中將是一項具有挑戰性的任務。

5

主要原因 - 對於我來說,根據依賴注入模式編寫代碼並使用IoC框架來獲取可測試的代碼。然而,在測試代碼中使用IoC容器會得到相反的結果。從你的問題我可以看出你已經遇到了這個問題。

當使用服務定位器(SL)模式而不是依賴注入(DI)模式時,這尤其是問題。使用SL模式,類直接調用IoC容器(或這種容器的抽象),而不是爲類提供所需的依賴(使用構造函數注入)。由於類直接調用容器,因此您還需要在測試環境中配置該容器。這很痛苦,因爲測試配置或虛假對象通常變得非常複雜,因爲您經常希望在每個測試的基礎上影​​響虛假行爲,同時保持線程安全,因爲測試框架可能並行運行測試( MSTest做到這一點)。我知道我在過去寫過一些瘋狂的線程安全測試代碼,然後才發現我做的都是錯的:-(。

所以你應該在應用程序代碼中使用DI模式,並在測試中使用應該手動連接這些依賴關係,例如,當測試類別爲ICustomerServiceHomeController類時,通常應在測試類中使用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框架,在這種情況下您將面臨失敗。不幸的是,我從經驗談起。

+0

我沒有使用SL模式,幸運的是......只有構造函數注入。我想我記得在並行測試中使用google搜索,因爲我有同樣的擔憂,並且看到默認情況下MSBuild不會並行運行測試,但我可能是錯誤的。 – Jeff 2010-11-24 19:03:16