gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 21:15:00 25 4
gpt4 key购买 nike

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

  • 我的网站.网站 (MVC)
  • MySite.WebsiteTest

目前我的网站中有一个 IoC 容器。我应该为我的测试重新创建另一个 IoC 容器吗?或者有没有办法在两者中使用 IoC?

最佳答案

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

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

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

举个例子:

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 接口(interface)并手动构建 Controller 。

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

关于testing - 如何在测试中管理 IoC 容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2923325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com