Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.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# 理解为什么我们在单元测试中使用控制容器的反转_C#_Dependency Injection_Ninject_Inversion Of Control - Fatal编程技术网

C# 理解为什么我们在单元测试中使用控制容器的反转

C# 理解为什么我们在单元测试中使用控制容器的反转,c#,dependency-injection,ninject,inversion-of-control,C#,Dependency Injection,Ninject,Inversion Of Control,我目前正在考虑将Ninject合并到我的单元测试中。浏览一些与前面的问题相关的非常聪明的帖子(,);我想我得到了一些核心概念,但我正在努力解决一些if的应用 大多数情况下,当使用IOC容器时,它与将它们合并到单元测试中有关。然而,从实际的角度来看,如果我还没有将Ninject这样的框架合并到实际的代码库中,那么在我的单元测试中使用Ninject这样的框架有意义吗 下面的例子就是一个很好的例子(摘自James Bender的专业C#测试驱动开发:使用TDD开发真实世界的应用程序) 当我在代码中加入

我目前正在考虑将Ninject合并到我的单元测试中。浏览一些与前面的问题相关的非常聪明的帖子(,);我想我得到了一些核心概念,但我正在努力解决一些if的应用

大多数情况下,当使用IOC容器时,它与将它们合并到单元测试中有关。然而,从实际的角度来看,如果我还没有将Ninject这样的框架合并到实际的代码库中,那么在我的单元测试中使用Ninject这样的框架有意义吗

下面的例子就是一个很好的例子(摘自James Bender的专业C#测试驱动开发:使用TDD开发真实世界的应用程序)


当我在代码中加入依赖倒置原则时;我认为IOC容器的价值是减少与我的类如何实例化相关的冗余/集中代码的一种方法(这是遵守依赖倒置原则的结果)。但是,如果我不想在代码中使用IOC容器,那么将Ninject这样的东西单独作为单元测试框架堆栈的一部分是否切实可行?

为什么要在测试中使用DI框架?你的对象图很难组成吗

我个人认为,让测试显式地创建它们的依赖关系会更好,因为注入mock或stub在测试中是显式的,并且非常可见

它还隐藏了有关创建复杂依赖关系层次结构的任何问题。在测试中创建所有对象意味着您将不得不感受创建这些依赖项的痛苦,并可能激励您改进设计

我不认为在这种情况下,使用DI框架可以为您带来任何好处,除了混淆测试所具有的依赖关系


集成测试可能是另一种情况,但对于单元测试…

对于集成测试,您可能需要使用容器,而不是单元测试+1@Steven是 啊在我的集成测试中,我一直在使用一种鼓励您进入成功陷阱的方法。推荐得不够高;-)那看起来是个不错的容器。有一天我一定要试试看:-)
[TestFixture]
public class PersonServiceTests
{
    [Test]
    public void ShouldBeAbleToCallPersonServiceAndGetPerson()
    {
        var expected = new Person {Id = 1, FirstName = “John”, LastName = “Doe”};
        var kernel = new StandardKernel(new CoreModule());
        var personService = kernel.Get < PersonService > ();
        var actual = personService.GetPerson(expected.Id);
        Assert.AreEqual(expected.Id, actual.Id);
        Assert.AreEqual(expected.FirstName, actual.FirstName);
        Assert.AreEqual(expected.LastName, actual.LastName);
    }
}
[TestFixture]
public class PersonServiceTests
{
    [Test]
    public void ShouldBeAbleToCallPersonServiceAndGetPerson()
    {
        var expected = new Person {Id = 1, FirstName = “John”, LastName = “Doe”};
        var personService = new PersonService();
        var actual = personService.GetPerson(expected.Id);
        Assert.AreEqual(expected.Id, actual.Id);
        Assert.AreEqual(expected.FirstName, actual.FirstName);
        Assert.AreEqual(expected.LastName, actual.LastName);
    }
}