无法获取Integration类ninject的默认构造函数

时间:2013-08-01 05:37:48

标签: c#-4.0 design-patterns dependency-injection ninject

我是使用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"));
    }
}

测试工作正常。 我的问题是,为什么我会收到这个错误?是有办法解决它吗? 提前谢谢。

2 个答案:

答案 0 :(得分:5)

单元测试框架要求您的测试类具有默认构造函数。您通常无法将DI容器与它们集成。您不必使用构造函数注入,而是必须直接从代码中调用容器,但是对于单元测试,您通常根本不应该有容器(但是对于集成测试,这是可以的)。

答案 1 :(得分:0)

您可以为该类添加无参数构造函数。它对我有用。