c# - 为使用 IoC.Resolve() 的服务创建单元测试的最佳方法是什么

标签 c# .net unit-testing ioc-container

我通过构造函数注入(inject)使用 IoC 容器而不是 DI。有些人可能会问为什么我使用 IoC 容器而不是构造函数注入(inject)。好吧,原因如下:Why do I need an IoC container as opposed to straightforward DI code? 。 但是,我发现为我的服务创建单元测试很困难。我不确定如何在运行时模拟我的服务使用的存储库,因为我没有使用构造函数注入(inject)(一个难题)。有人有解决办法吗?

例如:

public class SomeService
{
    private ISomeServiceRepository someServiceRepository;

    public GetSomeThing()
    {
        //how do I mock this repository in my unit test
        someServiceRepository = IoC.Resolve<ISomeServiceRepository>();

        someData = someServiceRepository.getData();

        someOtherService = new SomeOtherService();
        someThing = someOtherService.GetSomeThing();

        return FigureOutSomeThingElse(someData, someThing);
    }

    public FigureOutSomeThingElse(someData, someThing)
    {
        //do some figuring
        return somethingElse;
    }
} 

public class SomeOtherService
{
    private ISomeServiceRepository someOtherServiceRepository;

    public GetSomeThing()
    {
        //how do I mock this repository in my unit test
        someOtherServiceRepository = IoC.Resolve<ISomeOtherServiceRepository>();

        var someData = someOtherServiceRepository.getData();
        return someData;
    }
}

最佳答案

您确实不应该在类方法中使用 IOC.Resolve。无论如何,它非常接近于新建代码,这是您试图避免使用 DI 的一部分。更好、更可测试的编写方式应该是这样的。

Public Class SomeService
{

  ISomeServiceRepository someServiceRepository;

  public SomeService(ISomeServiceRepository someServiceRepository)
  {
    this.someServiceRepository = someServiceRepository
  }

  Public GetSomeThing()
  {

    someData = someServiceRepository.getData();
    ...
  }
}

通过这样做,您可以模拟您的界面并直接注入(inject)它。

如果您必须使用.Resolve,那么 Adam 的方法是您能做到的最好的方法

关于c# - 为使用 IoC.Resolve() 的服务创建单元测试的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11434171/

相关文章:

c# - 使用 C# 发送邮件,使用客户端发送 Lotus Notes

.net - 是否有更喜欢约定而不是配置的 .NET IoC?

python - 我是一名 .NET 程序员。 Python 和/或 Ruby 的具体用途是什么可以提高我的工作效率?

python-3.x - python : mock file input for testing function

unit-testing - 如何测试仅将调用委托(delegate)给 AR 实体的聚合根方法?

c# - 在多个显示器上绘制所有窗口

c# - 必须是具有公共(public)无参数构造函数的非抽象类型

c# - 如何绑定(bind)到文本框的 CaretIndex aka 光标位置

c# - 如何本地化 UserControl

java - 如何使用 Mockito 模拟被调用两次且第二个方法调用的参数是第一个方法调用的输出的方法