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

时间:2017-08-14 19:49:59

标签: c# unit-testing testing asp.net-web-api2 dryioc

对不起,我没有太多代码需要分享,因为我不确定这是如何运作的。

我有一个名为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>();
    }

1 个答案:

答案 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.

}

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