我正在对使用统一依赖注入框架的类进行单元测试。
返回null: ServiceLocator.Current.GetInstance();
如何让它返回模拟对象或仅返回对象本身?
答案 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