没有无参数构造函数的.NET单元测试,以便于依赖注入

Nic*_*ski 12 nunit unit-testing dependency-injection inversion-of-control autofac

我正在尝试让单元测试不依赖于调用container.Resolve <T>()来获取它们的依赖项.

我目前正在使用AutoFac 2.2.4,并尝试过xUnit.NETNUnit,但两者都有这个问题:

没有为此对象定义的无参数构造函数

我如何解决这个问题?它是一个特定的单元测试框架,它将支持这个,或者只是如何配置所述框架?

我不应该这样做吗?或者我可以设置测试类以使用具有唯一依赖关系的构造函数吗?

这是一些代码:

public class ProductTests : BaseTest
{
    readonly private IProductRepository _repo;

    public ProductTests(IProductRepository r)
    {
        _repo = r;
    }

    //working unit tests here with default constructor
} 
Run Code Online (Sandbox Code Playgroud)

我是否选择在基类构造函数中错误地初始化容器?

public abstract class BaseTest
{
    protected BaseTest()
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<ProductRepository>().As<IProductRepository>();
        builder.Build();
    }
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*old 12

最初的问题确实是由于测试框架的设计方式.它们都需要无参数构造函数才能实例化测试实例.理所当然.使用这些框架,不依赖构造函数进行测试初始化​​.这就是该SetUp方法的目的.总而言之,测试类本身不适合注射.

而IMO,当您开发不依赖于容器的测试时,这就成了一个问题.毕竟,每个测试类应该关注一个"被测系统"(SUT).为什么不让setup方法直接实例化该系统并提供每个依赖(通常以伪造的形式)?通过这种方式,您可以有效地从测试中删除另一个不必要的依赖项,即IoC框架.

旁注:我在测试中唯一涉及IoC框架的是"容器测试".这些测试侧重于验证在使用应用程序或程序集模块初始化容器后,可以从容器中解析某些服务.

  • 只需补充一点,测试框架可用于单元测试之外,以实现更高级别测试的自动化.在这种情况下,使用DI容器可以用于匹配生产依赖性并简化SUT接线. (3认同)