我试图让单元测试不依赖于调用container.Resolve< T>()作为依赖关系.
我目前正在使用AutoFac 2.2.4,并尝试过xUnit.NET和NUnit,但都有这个问题:
No parameterless constructor defined for this object
如何解决这个问题?它是一个特定的单元测试框架,将支持这一点,还是框架如何配置?
我该不该这样做?或者我可以设置测试类来与唯一依赖的构造函数一起工作吗?
这里有一些代码:
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(); } }
最初的问题确实在于如何设计测试框架.他们都需要一个无参数的构造函数来实例化测试实例.真的是这样.使用这些框架,构造函数不被用于测试初始化.这就是SetUp方法的目的.总而言之,测试类本身不适合注射.
原文链接:https://www.f2er.com/javaschema/281433.html和IMO,当您开发测试不依赖于容器时,这成为一个非问题.毕竟,每个测试类应该集中在一个“被测系统”(SUT)上.为什么没有设置方法直接实例化该系统并提供每个依赖(通常以假货的形式)?通过这样做,您可以有效地从测试中删除另一个不必要的依赖关系,即IoC框架.
在旁注:我在测试中唯一涉及IoC框架的是在我的“容器测试”中.这些测试集中在验证容器在使用application or assembly modules初始化之后可以从容器中解决某些服务.