Это должно сделать трюк:

я проблемы с созданием вручнуюIServiceProvider что позволит моим модульным тестам использовать его для получения конфигурации общего теста с использованиемGetService<IOptions<MyOptions>>

Я создал несколько модульных тестов, чтобы проиллюстрировать свои проблемы, также можно сделать репозиторий.нашел здесь если это полезно в ответе на вопрос.

JSON

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

Класс опций

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

Тесты

Из этих тестовConfigureWithBindMethod а такжеConfigureWithBindMethod оба терпят неудачу, где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

На первый взгляд, я бы предположил, что Value не должен быть нулевым, что наводит меня на мысль, что я могу упустить что-то очевидное здесь, так что если кто-то может заметить, что я делаю неправильно, это будет гениально.

Спасибо!

Ответы на вопрос(1)

Ваш ответ на вопрос