是我尝试进行单元测试的生产代码示例。我正在努力解决对正在使用的具体类的依赖。
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。如何在我的单元测试代码中进行设置?我觉得这里缺少一些东西。这有一种反模式的味道......
答案 0 :(得分:9)
这有一种反模式的味道
当然可以。为什么要将实例传递给DI容器到业务对象的构造函数中?您应该通过IInterface
。请参阅Dependency Injection container in constructor。
无论如何要在单元测试中使这个工作,你只需要设置容器来返回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
。
答案 1 :(得分:1)
我同意CodeCaster。典型的模式是在构造函数中接受 IInterface 类型的参数,并将其分配给类级变量。
<distributionManagement>
<repository>
<id>deploymentRepo</id>
<name>Internal Releases</name>
<url>http://35.193.152.132:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>deploymentRepo</id>
<name>Internal Releases</name>
<url>http://35.193.152.132:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
进行测试时,只需输入您的起订量即可。 就是说,有时候我不喜欢通过构造函数传递依赖。如:
在这些情况下,将容器作为参数传递是我遇到的唯一解决方案。只需确保将容器的初始实例注册到其自身即可。否则,DI将为您的构造函数提供一个新的(空)容器。如果有人有更好的模式,尤其是与Unity兼容的模式,我很乐意看到它。