使用ServiceLocator进行单元测试

时间:2009-10-15 15:18:51

标签: unit-testing unity-container

我正在对使用统一依赖注入框架的类进行单元测试。

返回null: ServiceLocator.Current.GetInstance();

如何让它返回模拟对象或仅返回对象本身?

4 个答案:

答案 0 :(得分: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 :(得分:4)

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

然后在测试有问题的类时,将依赖项的伪/模拟版本传递给“真正的”构造函数,完全绕过默认版本。

答案 2 :(得分:1)

您是否在测试核心“DI集成”代码?如果没有,那么您的正常代码绝不应该(很少,很少)与您的DI框架进行交互。

通常,您的依赖项将通过构造函数注入注入,并且在测试时,您可以提供模拟对象作为构造函数依赖项。例如:

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

使用上面的代码,您可以简单地模拟IBar,并将其传递给Foo构造函数。

答案 3 :(得分:1)

您始终可以设置Container + ServiceLocator并实际满足所需的依赖关系,例如,通过注册模拟。有关如何设置容器/定位器的信息,请参阅代码示例#4:

http://blogs.msdn.com/b/miah/archive/2009/05/12/servicelocator-and-unity-be-careful.aspx

相关问题