2009-10-15 125 views
5

我正在對使用unity依賴注入框架的類進行單元測試。使用ServiceLocator進行單元測試

返回空值: ServiceLocator.Current.GetInstance();

我怎樣才能得到它返回一個模擬對象或只是對象本身?

回答

4

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); 
} 
1

你在測試你的核心「DI集成」代碼嗎?如果沒有,你的正常代碼永遠不會(很少,很少)與你的DI框架進行交互。

通常你的依賴將通過構造器注入來注入,而在測試時,你可以提供模擬對象作爲那些構造器依賴。例如:

public class Foo { 
    public Foo (IBar bar) { 
     bar.Lift(); 
    } 
} 

通過上面的代碼,您可以簡單地模擬IBar,並將其傳遞給Foo構造函數。

4

你可以利用窮人的注射。創建一個默認構造函數,它從服務定位器中檢索依賴項,並將這些依賴項轉發給一個「真實」構造函數,並將它們作爲參數。這照顧生產情況。

然後,當測試有問題的類時,將虛擬/模擬版本的依賴關係傳遞給「真實」構造函數,繞過默認構造函數。