我是使用ninject和Dependency Injection的新手,并且使用它时遇到了问题。
我尝试在我的类库中使用Ninject,并构建集成测试。 现在,我在很多例子中看到,使用ninject只是指定了DI模块:
Public Class DIModule : NinjectModule
public override void Load()
{
Bind<IUSAServices>().To<USAServices>();
}
然后在我的测试课上,我试着调用我的依赖是这样的:
[TestClass]
public class USAIntegrationTests
{
private readonly IUSAServices _usaService;
public USAIntegrationTests(IUSAServices usaServices)
{
_usaService = usaServices;
}
[TestMethod]
public void ValidateUserTests()
{
Assert.IsTrue(_usaService.ValidateUser("username1", "password1"));
}
}
并且出现此错误:
Unable to get default constructor for class USATests.IntegrationTests.USAIntegrationTests.
但是我阅读了文档,并尝试了这样:
[TestClass]
public class USAIntegrationTests
{
private readonly IUSAServices _usaService;
public USAIntegrationTests()
{
using (IKernel kernel = new StandardKernel(new DIModule()))
{
_usaService = kernel.Get<IUSAServices>();
}
}
[TestMethod]
public void ValidateUserTests()
{
Assert.IsTrue(_usaService.ValidateUser("mantab", "banget"));
}
}
测试工作正常。 我的问题是,为什么我会收到这个错误?是有办法解决它吗? 提前谢谢。
答案 0 :(得分:5)
单元测试框架要求您的测试类具有默认构造函数。您通常无法将DI容器与它们集成。您不必使用构造函数注入,而是必须直接从代码中调用容器,但是对于单元测试,您通常根本不应该有容器(但是对于集成测试,这是可以的)。
答案 1 :(得分:0)
您可以为该类添加无参数构造函数。它对我有用。