【发布时间】:2014-11-23 22:09:03
【问题描述】:
我目前正在考虑将 Ninject 合并到我的单元测试中。在浏览与早期问题相关的一些非常聪明的帖子时(What is Ninject and when do you use it?,http://martinfowler.com/articles/injection.html);我想我得到了一些核心概念,但我正在努力解决一些如果它的应用程序。
大多数时候,当 IOC 容器被提出时,它与将它们合并到您的单元测试中有关。但是,从实际的角度来看,如果我还没有将 Ninject 之类的框架整合到我的实际代码库中,那么在我的单元测试中使用它是否有意义?
以下面的示例为例(摘自 James Bender 的 Professional Test Driven Development with C#: Developing Real World Applications with TDD)
[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);
}
}
使用 Ninject 编写我的测试如何改善我的生活(或任何继承我的代码的可怜的开发人员),而不是将我的测试编写为:
[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);
}
}
当我将依赖倒置原则合并到我的代码中时;我认为 IOC 容器的价值是一种减少与我的类如何实例化相关的冗余/集中代码的方法(由于尊重依赖倒置原则)。但是,如果我不想在我的代码中使用 IOC 容器,那么仅将 Ninject 之类的东西用作我的单元测试框架堆栈的一部分是否可行?
【问题讨论】:
标签: c# dependency-injection ninject inversion-of-control