【问题标题】:How to get an instance of IConfiguration in asp.net core?如何在 asp.net core 中获取 IConfiguration 的实例?
【发布时间】:2018-06-09 14:04:57
【问题描述】:

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

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

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

控制器看起来像:

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

【问题讨论】:

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


    【解决方案1】:

    我可能应该从以下声明开始:在 .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;
        }
    }
    

    然后,通过单元测试传递您想要的任何设置非常简单。只需填写设置实例并使用任何可用的模拟框架包装到IOptions&lt;T&gt;,例如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);
    
        //  ...
    }
    

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

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

    【讨论】:

    • ConfigurationBuilder 来自哪个命名空间?
    • 找到了,是 Microsoft.Extensions.Configuration.Json
    猜你喜欢
    • 2020-08-27
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 2017-07-02
    • 2018-04-05
    相关资源
    最近更新 更多