下面是我尝试进行单元测试的生产代码示例。我正在努力解决对正在使用的具体类的依赖。
public MyClass(IUnityContainer container)
{
this.unityContainer = container;
}
public string DoWork()
{
var sender = unityContainer.Resolve<IInterface>(); // how to setup this object
var json = sender.Send("something");
var value = serializer.Deserialize<SomeModel>(json);
return value.url;
}
我想模拟此方法使用的 IInterface。我如何在我的单元测试代码中设置它?我觉得这里缺少一些东西。这有一种反模式的味道......
最佳答案
这是 "service locator" antipattern ,您将依赖项注入(inject)容器/控制反转注入(inject)到您的逻辑中。
您应该改为传递它所依赖的IInterface
,以便您控制它可以获得哪些实例。参见 Dependency Injection container in constructor .
如果您无法重构类,则必须在单元测试中注入(inject)容器。设置容器以返回 IInterface
的实例(或者更确切地说,模拟)。像这样:
public void MyUnitTest()
{
IUnityContainer myContainer = new UnityContainer();
myContainer.RegisterType<IInterface, YourInstance>();
MyClass classUnderTest = new MyClass(myContainer);
classUnderTest.DoWork();
Assert...
}
参见 How to use Unity.RegisterType with Moq?模拟 YourInstance
。
关于c# - 最小起订量与 Unity 容器单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32484122/