我无法手动构建IServiceProvider
,以便我的单元测试可以使用它来使用GetService<IOptions<MyOptions>>
我创建了一些单元测试来说明我的问题,如果它在回答问题时有用,可以found here。
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
从表面上看,我假设价值不应该是空的,这导致我认为我可能会遗漏一些明显的东西,所以如果有人能够发现我做错了什么&#39;天才。
谢谢!
答案 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);
}