Moq与Unity Container单元测试

时间:2015-09-09 15:51:19

标签: c# unit-testing unity-container moq

下面的

是我尝试进行单元测试的生产代码示例。我正在努力解决对正在使用的具体类的依赖。

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。如何在我的单元测试代码中进行设置?我觉得这里缺少一些东西。这有一种反模式的味道......

2 个答案:

答案 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兼容的模式,我很乐意看到它。

相关问题