即使GetSection正在运行,ServiceCollection也会为IOptions返回null

时间:2017-09-03 03:25:01

标签: .net .net-core

我无法手动构建IServiceProvider,以便我的单元测试可以使用它来使用GetService<IOptions<MyOptions>>

来引入共享测试配置

我创建了一些单元测试来说明我的问题,如果它在回答问题时有用,可以found here

JSON

{
  "Test": {
    "ItemOne":  "yes"
  }
}

选项类

public class TestOptions
{
    public string ItemOne { get; set; }
}

测试

这些测试ConfigureWithBindMethodConfigureWithBindMethod都失败,SectionIsAvailable通过。因此,据我所知,该部分正在按照预期从JSON文件中使用。

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void ConfigureWithoutBindMethod()
    {
        var collection = new ServiceCollection();

        var config = new ConfigurationBuilder()
            .AddJsonFile("test.json", optional: false)
            .Build();

        collection.Configure<TestOptions>(config.GetSection("Test"));

        var services = collection.BuildServiceProvider();

        var options = services.GetService<IOptions<TestOptions>>();

        Assert.IsNotNull(options);
    }

    [TestMethod]
    public void ConfigureWithBindMethod()
    {
        var collection = new ServiceCollection();

        var config = new ConfigurationBuilder()
            .AddJsonFile("test.json", optional: false)
            .Build();

        collection.Configure<TestOptions>(o => config.GetSection("Test").Bind(o));

        var services = collection.BuildServiceProvider();

        var options = services.GetService<IOptions<TestOptions>>();

        Assert.IsNotNull(options);
    }

    [TestMethod]
    public void SectionIsAvailable()
    {
        var collection = new ServiceCollection();

        var config = new ConfigurationBuilder()
            .AddJsonFile("test.json", optional: false)
            .Build();

        var section = config.GetSection("Test");
        Assert.IsNotNull(section);
        Assert.AreEqual("yes", section["ItemOne"]);
    }
}

指出

可能有用

在即时窗口中调用config.GetSection("Test")时,我会得到此值

{Microsoft.Extensions.Configuration.ConfigurationSection}
    Key: "Test"
    Path: "Test"
    Value: null

从表面上看,我假设价值不应该是空的,这导致我认为我可能会遗漏一些明显的东西,所以如果有人能够发现我做错了什么&#39;天才。

谢谢!

1 个答案:

答案 0 :(得分:5)

要使用服务集合中的选项,您需要添加使用选项所需的服务collection.AddOptions();

这应该可以解决问题:

[TestMethod]
public void ConfigureWithoutBindMethod()
{
    var collection = new ServiceCollection();
    collection.AddOptions();

    var config = new ConfigurationBuilder()
        .AddJsonFile("test.json", optional: false)
        .Build();

    collection.Configure<TestOptions>(config.GetSection("Test"));

    var services = collection.BuildServiceProvider();

    var options = services.GetService<IOptions<TestOptions>>();

    Assert.IsNotNull(options);
}