c# - 最小起订量与 Unity 容器单元测试

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

最佳答案

这是 "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/

相关文章:

c# - Ninject MVC3 - Bootstrap 抛出 "Already Initialized"异常

c# - 保持控制台窗口打开

unit-testing - 我在哪里可以获得 FlexUnit

ruby-on-rails - 了解 Rails 单元测试 : Is it still a unit test if a single test tests model interdependencies?

c# - 如何设置 Unity 注册约定?

c# - NuGet 依赖项不使用 VS2013 和 AWS Elastic Beanstalk 进行复制

c# - IEnumerable 到具有间隔的 Observable

c# - 如何通过 ConfigurationManager 写入 User.Config 文件?

python - 使用异步事件循环运行 tornado.testing.AsyncTestCase

c# - Unity IoC 与 Windows 窗体