asp.net-core - 如何构建 IOptions<T> 进行测试?

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

在 ASP.NET Core 2 中,我有以下类需要 IOptions<T>

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 能够注入(inject) IOptions<MyOptions>进入 MyService 类。

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

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<MyOptions>("MyOptions")两者都返回 null。

当我快速观看_config时变量我看到值是从 appsettings.json 加载的 enter image description here

最佳答案

找到了。我必须绑定(bind)实例

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

关于asp.net-core - 如何构建 IOptions<T> 进行测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49262906/

相关文章:

c# - 使用ASP.NET Core的跨平台USB通信

.NET Core GetCurrentDirectory 返回父目录

.net-core - 使用csproj在NuGet程序包中包含非托管DLL

c# - Entity Framework 数据库优先 .Net Core

asp.net-core-mvc - .Net Core SignalR - 连接超时 - 心跳计时器 - 连接状态更改处理

c# - .net Core 2.1 应用程序中的 Windows 身份验证

asp.net-core - aspnet 核心 2.0 dotnet 运行时出现警告

asp.net-core - DbContext 实例不能在 OnConfiguring 内部使用,因为此时它仍在配置中

api - 如何动态实现api版本控制和swagger文档

c# - 聊天机器人可以在本地机器人框架模拟器中正常工作,但不能在天蓝色聊天机器人中工作