0

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

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

新闻控制器

    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>();
    }
4

1 回答 1

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.

}

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

于 2017-08-14T20:20:28.163 回答