Testing 如何在测试中管理IoC容器?

Testing 如何在测试中管理IoC容器?,testing,inversion-of-control,ninject,Testing,Inversion Of Control,Ninject,我对测试和IoC容器非常陌生,有两个项目: 网站(MVC) MySite.WebsiteTest 目前我的网站上有一个IoC容器。我应该为我的测试重新创建另一个IoC容器吗?或者有没有一种方法可以同时使用IoC?测试是关于真正的实现。因此,您通常不应该在单元测试中使用IOC。如果您真的觉得需要它(一个组件取决于另一个组件),请使用接口隔离交互,并使用模拟库(Moq很好)模拟它并进行测试 我看到IOC容器用于测试的唯一机会是在集成测试中。当您有一个IOC容器时,希望您也会进行某种依赖注入-无论

我对测试和IoC容器非常陌生,有两个项目:

  • 网站(MVC)
  • MySite.WebsiteTest

目前我的网站上有一个IoC容器。我应该为我的测试重新创建另一个IoC容器吗?或者有没有一种方法可以同时使用IoC?

测试是关于真正的实现。因此,您通常不应该在单元测试中使用IOC。如果您真的觉得需要它(一个组件取决于另一个组件),请使用接口隔离交互,并使用模拟库(Moq很好)模拟它并进行测试


我看到IOC容器用于测试的唯一机会是在集成测试中。

当您有一个IOC容器时,希望您也会进行某种依赖注入-无论是通过构造函数还是setter注入

单元测试的重点是在隔离的情况下测试组件,而进行DI在这方面有很大的帮助。您要做的是通过手动构造类并向其传递所需的依赖项来对每个类进行单元测试,而不是依赖容器来构造它

这样做的意义很简单。您希望尽可能地隔离SUT(测试中的系统)。如果您的SUT依赖于另一个类和IoC来注入它,那么您实际上是在测试三个系统,而不是一个

以以下为例:

public class ApiController : ControllerBase {

  IRequestParser m_Parser;

  public ApiController(IRequestParser parser) {
    m_Parser = parser;
  }

  public ActionResult Posts(string request) {
    var postId = m_Parser.GetPostId(request);
  }
} 
ApiController
构造函数是一个依赖项构造函数,将在运行时由IoC容器调用。但是,在测试期间,您需要模拟
IRequestParser
接口并手动构造控制器

[Test]
public void PostsShouldCallGetPostId() {
  //use nmock for mocking
  var requestParser = m_Mocks.NewMock<IRequestParser>();
  //Set up an expectation that Posts action calls GetPostId on IRequestParser
  Expect.Once.On(requestParser).Method("GetPostId").With("posts/12").Will(Return.Value(0));
  var controller = new ApiController(requestParser);
  controller.Posts("posts/12");
}
[测试]
public void postshouldCallGetPostId(){
//使用nmock进行模拟
var requestParser=m_Mocks.NewMock();
//设置在IRequestParser上发布操作调用GetPostId的期望
Expect.Once.On(requestParser.Method(“GetPostId”).With(“posts/12”).Will(Return.Value(0));
var控制器=新的ApiController(requestParser);
主计长职位(“职位/12”);
}

你是说如何共享映射?是的,我的网站上有“NinjectControllerFactory.cs”。我应该把这个复制到我的测试项目中,还是应该在网站和测试项目中使用这个类。最初的海报没有问他是否应该创建单元测试或集成测试。