2009-10-15 126 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

你可以利用穷人的注射。创建一个默认构造函数,它从服务定位器中检索依赖项,并将这些依赖项转发给一个“真实”构造函数,并将它们作为参数。这照顾生产情况。

然后,当测试有问题的类时,将虚拟/模拟版本的依赖关系传递给“真实”构造函数,绕过默认构造函数。