我正尝试通过以下方式在HostBuilder
测试用例中使用MsTest
类:
[TestMethod]
public void SomeTest()
{
var builder = new HostBuilder()
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.AddJsonFile("appsettings.json", optional: true);
})
.ConfigureServices((hostContext, services) =>
{
var section = hostContext.Configuration.GetSection("AppConfig");
Assert.IsNotNull(section.Value, "Appconfig sections was not loaded");
});
var host = builder.Build();
}
因此,我有一个appsettings.json
文件已添加到config
对象中。
问题:呼叫hostContext.Configuration.GetSection("AppConfig")
时section.Value
是null
(激发了Assert
)。如果我调试代码,我可以看到hostContext.Configuration
有一个JsonConfigurationProvider
,它已经解析了appsettings.json
中定义的适当值。
环境: netcoreapp3.1
Update1::我已将源代码上传到Github。
任何帮助将不胜感激。
谢谢。
答案 0 :(得分:1)
不确定您是否能够解决此问题,但我也遇到了类似的问题!我能够解决的问题是,在检查appsettings.json属性时,似乎该文件的默认操作是从来没有。因此,当在目标文件夹中构建项目时,永远不会复制appsettings.json文件。将此设置更改为“总是复制”或“如果更新则复制”即可解决,现在我在目标执行文件夹中获取了更新的json文件。
您所拥有的代码似乎很好-我的代码非常相似。
要测试是否确实存在此问题,请更改
config.AddJsonFile("appsettings.json", optional: true);
到
config.AddJsonFile("appsettings.json", optional: false);
如果文件不存在,这将强制应用程序失败。这也是我经过令人尴尬的长时间后才发现问题的方式。
要检查此文件的属性,请在解决方案资源管理器上右键单击它,然后选择属性。在默认的VS 2019中,属性面板位于解决方案资源管理器的下方。
答案 1 :(得分:0)
就我而言,我从 cmd 实例运行该应用程序,因此基本上它是一个不同的工作目录,因此无法找到 appsettings.json
。首先cd
进入目录有帮助。
我用它总是从基本目录加载配置,如果丢失则抛出:
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.SetBasePath(AppContext.BaseDirectory);
config.Sources
.OfType<Microsoft.Extensions.Configuration.Json.JsonConfigurationSource>()
.Where(x => x.Path == "appsettings.json")
.ForEach(x => x.Optional = false);
})