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

12 浏览
0 Comments

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

我目前正在研究将Ninject集成到我的单元测试中。通过阅读一些与早期问题相关的非常聪明的帖子(Ninject是什么,什么时候使用它?http://martinfowler.com/articles/injection.html);我认为我理解了一些核心概念,但我对其中一些应用还有困惑。\n大多数情况下,当提到IOC容器时,是在将它们纳入到您的单元测试中。然而,从实际角度来看,如果我还没有将它纳入到我的实际代码库中,使用像Ninject这样的框架在我的单元测试中是否有意义?\n以下是一个例子(摘自James Bender的《使用C#进行专业测试驱动开发:用TDD开发实际应用程序》):\n

[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);
    }
}

\n使用Ninject编写我的测试如何改善我的生活(或任何继承我的代码的开发人员),而不是只是像这样编写我的测试:\n

[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);
    }
}

\n随着我将依赖反转原则引入到我的代码中,我看到了使用IOC容器的价值,它可以减少与我的类实例化方式相关的冗余/集中代码(作为遵守依赖反转原则的结果)。然而,如果我不使用IOC容器来编写代码,使用类似Ninject这样的框架作为我的单元测试框架是否实际?

0
0 Comments

在单元测试中为什么会使用DI(依赖注入)框架呢?你的对象图是如此难以组合吗?

个人认为最好的方法是让测试显式地创建它们的依赖关系,这样注入的模拟对象或存根将在测试中明确可见。

这也隐藏了围绕创建复杂依赖层次的任何问题。在测试中创建所有对象意味着你必须面对创建这些依赖关系的痛苦,并可能激励你改进设计。

我认为在这种情况下使用DI框架并没有带来任何好处,除了混淆你的测试所依赖的依赖项。

集成测试可能会有不同的情况,但对于单元测试来说...

对于集成测试,你可能需要使用容器,但对于单元测试来说不需要。

是的,对于我的集成测试,我一直在使用一个很棒的容器,它鼓励你陷入成功的陷阱。我非常推荐它 😉

这个容器看起来不错。我一定要试试它的一天 🙂

为了解决在单元测试中使用DI框架的问题,我们可以使用显式地创建依赖关系的方式,而不使用容器。这样做的好处是可以使测试中的依赖关系明确可见,避免了使用容器后依赖项的混淆。此外,显式地在测试中创建所有对象还可以让我们感受到创建这些依赖关系的痛苦,从而激励我们改进设计。

然而,在集成测试中,使用容器可能是必要的。在这种情况下,我们可以选择使用一个鼓励成功的容器,如Simple Injector。这个容器可以帮助我们更好地组织和管理依赖关系,使集成测试更加简单和可靠。

在单元测试中使用DI框架可能并不是最佳选择。我们可以通过显式地创建依赖关系来使测试更加清晰和可见,同时也能够更好地感受到设计上的问题。在集成测试中,使用容器可能是必要的,这时我们可以选择一个适合我们需求的容器来简化测试的编写和维护。

0