【问题标题】:How to build IOptions<T> for testing?如何构建 IOptions<T> 进行测试?
【发布时间】:2018-03-13 18:01:51
【问题描述】:

在 ASP.NET Core 2 中,我有以下采用 IOptions&lt;T&gt; 的类

public class MyOptions
{
    public string Option1 { get; set; }
    public string Option2 { get; set; }
}


public class MyService:IMyService
{
  private readonly MyOptions _options;
  public MyService(IOptions<MyOptions> options)
  {
    _options = options.Value;
  }
}

appsettings.json

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  },  
  "MyOptions": {
    "Option1": "option 1 value",
    "Option2": "option 2 value"
  }
}

然后我在 startup.cs 我注册选项如下

services.Configure<MyOptions>(Configuration.GetSection("MyOptions"));

dotnet 能够将IOptions&lt;MyOptions&gt; 注入 MyService 类。

现在,我有集成测试项目。我已将相同的 appsettings.json 复制到集成测试项目中。我想创建从 appsettings.json 加载值的 IOptions&lt;MyOptions&gt; 实例

public class MyTestClass
{
    private readonly IConfigurationRoot _config;

    public MyTestClass()
    {                        
        _config = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .Build();
    }

    [Fact]
    public void MyTest()
    {
        // arrange

        // this line returns NULL
        var optionValue  = _config.GetSection("MyOptions").Value;

        // i also tried GetValue which returns NULL as well
        //var optionValue = _config.GetValue<MyOptions>("MyOptions");

        var options = Options.Create<MyOptions>(optionValue);
        var service = new MyService(options);

        //act

        // assert
    }
}

_config.GetSection("MyOptions").Value_config.GetValue&lt;MyOptions&gt;("MyOptions") 都返回 null。

当我快速查看 _config 变量时,我看到值是从 appsettings.json 加载的

【问题讨论】:

    标签: asp.net-core .net-core asp.net-core-2.0 coreclr


    【解决方案1】:

    找到了。我必须绑定实例

    var optionValue  = new MyOptions();
    _config.GetSection("MyOptions").Bind(optionValue);
     var options = Options.Create<MyOptions>(optionValue);
    

    或者我也可以

     var optionValue = _config.GetSection("MyOptions").Get<MyOptions>();
     var options = Options.Create<MyOptions>(optionValue);
    

    【讨论】:

    • 必须添加 Microsoft.Extensions.Configuration.Binder nuget 包才能拥有 Bind 或 Get 扩展方法
    猜你喜欢
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 2014-10-15
    相关资源
    最近更新 更多