我正在對使用unity依賴注入框架的類進行單元測試。使用ServiceLocator進行單元測試
返回空值: ServiceLocator.Current.GetInstance();
我怎樣才能得到它返回一個模擬對象或只是對象本身?
我正在對使用unity依賴注入框架的類進行單元測試。使用ServiceLocator進行單元測試
返回空值: ServiceLocator.Current.GetInstance();
我怎樣才能得到它返回一個模擬對象或只是對象本身?
MSDN有這個例子顯示how to implement the service locator pattern with Unity。實際上,您應該將服務定位器對象作爲類的構造函數參數傳遞。這使您可以通過MockUnityResolver
,使您可以完全控制單元測試。
[TestMethod]
public void InitCallsRunOnNewsController()
{
MockUnityResolver container = new MockUnityResolver();
var controller = new MockNewsController();
container.Bag.Add(typeof(INewsController), controller);
var newsModule = new NewsModule(container);
newsModule.Initialize();
Assert.IsTrue(controller.RunCalled);
}
你在測試你的核心「DI集成」代碼嗎?如果沒有,你的正常代碼永遠不會(很少,很少)與你的DI框架進行交互。
通常你的依賴將通過構造器注入來注入,而在測試時,你可以提供模擬對象作爲那些構造器依賴。例如:
public class Foo {
public Foo (IBar bar) {
bar.Lift();
}
}
通過上面的代碼,您可以簡單地模擬IBar,並將其傳遞給Foo構造函數。
你可以利用窮人的注射。創建一個默認構造函數,它從服務定位器中檢索依賴項,並將這些依賴項轉發給一個「真實」構造函數,並將它們作爲參數。這照顧生產情況。
然後,當測試有問題的類時,將虛擬/模擬版本的依賴關係傳遞給「真實」構造函數,繞過默認構造函數。
您可以隨時設置Container + ServiceLocator並實際滿足所需的依賴關係,例如通過註冊mocks。有關如何設置容器/定位器,請參閱代碼示例#4:
http://blogs.msdn.com/b/miah/archive/2009/05/12/servicelocator-and-unity-be-careful.aspx