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

Rab*_*spo 12 c# unit-testing dependency-injection .net-core asp.net-core

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

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

我试图从同一个项目中的单元测试项目初始化它.

控制器看起来像:

public Controller(IConfiguration configuration) { _configuration = configuration; }
Run Code Online (Sandbox Code Playgroud)

Cod*_*ler 26

我可能应该从.Net Core应用程序中的语句开始,你不应该将实例传递IConfiguration给你的控制器或其他类.您应该使用注入的强类型设置IOptions<T>.有关更多详细信息,请参阅此文章: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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

[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);

    //  ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 找到了,是 Microsoft.Extensions.Configuration.Json (3认同)