gpt4 book ai didi

c# - 如何将依赖项从测试项目传递到 DryIoc 中的具体实现

转载 作者:行者123 更新时间:2023-11-28 21:23:56 26 4
gpt4 key购买 nike

很抱歉,我没有太多代码可以分享,因为我不确定这将如何工作。

我有一个名为 API.Tests 的测试项目,我正在 API 项目中为 NewsController 编写测试。我不确定如何将依赖项从测试传递到 API,因为它是一种单向引用。

新闻 Controller

    private IGetNews _getNews;
private IAddNews _addNews;
private ILoggingService _log;

public NewsController()
{
_getNews = RegisterDependencies.container.Resolve<IGetNews>();
_addNews = RegisterDependencies.container.Resolve<IAddNews>();
_log = RegisterDependencies.container.Resolve<ILoggingService>();
}

最佳答案

您当前的代码正在使用服务定位器反模式。这使得 Controller 与这些依赖关系紧密耦合并且难以单独测试。您需要反转这些依赖关系。 (即:依赖倒置)

重构 Controller 以通过构造函数注入(inject)使用显式依赖项。

public class NewsController {
private readonly IGetNews getNews;
private readonly IAddNews addNews;
private readonly ILoggingService log;

public NewsController(IGetNews getNews, IAddNews addNews, ILoggingService log) {
this.getNews = getNews;
this.addNews = addNews;
this.log = log;
}

//...other code
}

对于单元测试,您现在可以模拟并将依赖项注入(inject)被测对象。以下示例使用模拟框架(Moq)来模拟依赖项并将它们注入(inject)到被测对象中

public void ExampleNewsControllerTest() {
//Arrange
var getNews = Mock.Of<IGetNews>();
var addNews = Mock.Of<IAddNews>();
var log = Mock.Of<ILoggingService>();

var subject = new NewsController(getNews, addNews, log);

//Act
//...exercise the method under test
subject.SomeAction();

//Assert
//...assert that the subject behaves as expected.

}

您将配置依赖项以适应测试用例/场景。

关于c# - 如何将依赖项从测试项目传递到 DryIoc 中的具体实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45682022/

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