Это должно сделать трюк:
я проблемы с созданием вручную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 не должен быть нулевым, что наводит меня на мысль, что я могу упустить что-то очевидное здесь, так что если кто-то может заметить, что я делаю неправильно, это будет гениально.
Спасибо!