对不起,我没有太多代码需要分享,因为我不确定这是如何运作的。
我有一个名为API.Tests的测试项目,我正在为API项目中的NewsController编写测试。我不确定如何将依赖项从测试传递给API,因为它是单向引用。
NewsController
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>();
}
答案 0 :(得分:1)
您当前的代码正在使用服务定位器反模式。这使得控制器与这些依赖关系紧密耦合,难以单独测试。您需要反转这些依赖项。 (即:依赖倒置)
通过构造函数注入重构控制器以使用显式依赖项。
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
}
对于单元测试,您现在可以模拟并将依赖项注入到测试对象中。以下示例使用模拟框架(Moq)来模拟依赖项并将它们注入到测试对象
中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.
}
您可以配置依赖项以适应测试用例/场景。