3

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

测试工作正常。我的问题是,为什么我会收到这个错误?这是绕过它的某种方式吗?提前致谢。

4

2 回答 2

5

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

于 2013-08-01T05:42:36.350 回答
0

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

于 2016-06-30T13:39:17.233 回答