如何在asp.net核心中获取IConfiguration的实例?

时间:2017-12-29 04:26:45

标签: c# unit-testing dependency-injection asp.net-core .net-core

我做了一个单元测试项目来测试我的webapi,我需要初始化一个控制器,问题是在构造函数中它收到一个IConfiguration,它是通过依赖注入提供的,并且工作正常。

但是当我想手动初始化它时,我无法得到这个实例。

我正在尝试从同一项目内部的单元测试项目初始化它。

控制器看起来像:

public Controller(IConfiguration configuration) { _configuration = configuration; }

1 个答案:

答案 0 :(得分:20)

我可能应该从.Net Core应用程序中的语句开始,你不应该将IConfiguration的实例传递给你的控制器或其他类。您应该使用通过IOptions<T>注入的强类型设置。有关详细信息,请参阅此文章:Options pattern in ASP.NET Core

使用选项模式时,您将获得控制器所需设置的POCO。然后将此设置对象注入包含在IOptions<T>

中的控制器中
public class ControllerSettings
{
    public string Setting1 { get; set; }

    public int Setting2 { get; set; }

    // ...
}

public class Controller
{
    private readonly ControllerSettings _settings;

    public Controller(IOptions<ControllerSettings> options)
    {
        _settings = options.Value;
    }
}

然后从单元测试中传递您想要的任何设置非常简单。只需使用任何可用的模拟框架(例如MoqNSubstitute)填充设置实例并换行到IOptions<T>

[TestMethod]
public void SomeTest()
{
    var settings = new ControllerSettings
    {
        Setting1 = "Some Value",
        Setting2 = 123,
    };

    var options = new Mock<IOptions<ControllerSettings>>();
    options.Setup(x => x.Value).Returns(settings);

    var controller = new Controller(options.Object);

    //  ...
}

有时需要使用项目的实际配置,例如在开发集成测试时。在这种情况下,您可以创建ConfigurationBuilder的实例,并使用与测试代码中相同的配置源填充它:

IConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
// Duplicate here any configuration sources you use.
configurationBuilder.AddJsonFile("AppSettings.json");
IConfiguration configuration = configurationBuilder.Build();