Nic*_*ski 12 nunit unit-testing dependency-injection inversion-of-control autofac
我正在尝试让单元测试不依赖于调用container.Resolve <T>()来获取它们的依赖项.
我目前正在使用AutoFac 2.2.4,并尝试过xUnit.NET和NUnit,但两者都有这个问题:
没有为此对象定义的无参数构造函数
我如何解决这个问题?它是一个特定的单元测试框架,它将支持这个,或者只是如何配置所述框架?
我不应该这样做吗?或者我可以设置测试类以使用具有唯一依赖关系的构造函数吗?
这是一些代码:
public class ProductTests : BaseTest
{
    readonly private IProductRepository _repo;
    public ProductTests(IProductRepository r)
    {
        _repo = r;
    }
    //working unit tests here with default constructor
} 
我是否选择在基类构造函数中错误地初始化容器?
public abstract class BaseTest
{
    protected BaseTest()
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<ProductRepository>().As<IProductRepository>();
        builder.Build();
    }
}
Pet*_*old 12
最初的问题确实是由于测试框架的设计方式.它们都需要无参数构造函数才能实例化测试实例.理所当然.使用这些框架,不依赖构造函数进行测试初始化.这就是该SetUp方法的目的.总而言之,测试类本身不适合注射.
而IMO,当您开发不依赖于容器的测试时,这就成了一个问题.毕竟,每个测试类应该关注一个"被测系统"(SUT).为什么不让setup方法直接实例化该系统并提供每个依赖(通常以伪造的形式)?通过这种方式,您可以有效地从测试中删除另一个不必要的依赖项,即IoC框架.
旁注:我在测试中唯一涉及IoC框架的是"容器测试".这些测试侧重于验证在使用应用程序或程序集模块初始化容器后,可以从容器中解析某些服务.