使用ServiceLocator进行单元测试

zac*_*ary 5 unit-testing unity-container

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

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

我怎样才能让它返回一个模拟对象或只是对象本身?

Gra*_*lin 5

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

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


Wim*_*nen 4

MSDN 有这个示例,展示了如何使用 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);
}
Run Code Online (Sandbox Code Playgroud)