Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 无法获取集成类ninject的默认构造函数_C# 4.0_Design Patterns_Dependency Injection_Ninject - Fatal编程技术网

C# 4.0 无法获取集成类ninject的默认构造函数

C# 4.0 无法获取集成类ninject的默认构造函数,c#-4.0,design-patterns,dependency-injection,ninject,C# 4.0,Design Patterns,Dependency Injection,Ninject,我对使用ninject和依赖注入是新手,但在使用它时遇到了问题 我尝试在我的类库中使用Ninject,并构建一个集成测试。 现在,我在许多示例中看到,对于使用ninject,DI模块的指定如下: Public Class DIModule : NinjectModule public override void Load() { Bind<IUSAServices>().To<USAServices>(); } [TestClass] public c

我对使用ninject和依赖注入是新手,但在使用它时遇到了问题

我尝试在我的类库中使用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"));
    }
}
[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"));
    }
}
得到这个错误:

Unable to get default constructor for class USATests.IntegrationTests.USAIntegrationTests.
然而,我阅读了文档并尝试如下:

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"));
    }
}
[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"));
    }
}
[TestClass]
公共类usaigrationtests
{
专用只读IUSAServices\u usaService;
公共用途集成测试()
{
使用(IKernel内核=新的标准内核(新的DIModule())
{
_usaService=kernel.Get();
}
}
[测试方法]
公共void ValidateUserTests()
{
Assert.IsTrue(_usaService.ValidateUser(“mantab”、“banget”));
}
}
测试正常。 我的问题是,为什么我会犯这样的错误?这是解决问题的办法吗?
提前感谢。

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

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

Related:Hi,那么你建议直接将依赖项实例化到我的测试类中吗?因为集成测试测试组件之间的集成,所以使用“真实”DI配置进行测试非常有用(并模拟一些导致麻烦的依赖项,例如邮件组件)。因此,更倾向于(间接地)调用容器,并确保您的集成测试重用您的生产DI配置。啊,对不起,但是您间接调用容器是什么意思?像使用工厂模式吗?不是工厂,而是使用门面。不是从测试中调用容器,而是调用facade。门面将调用容器。