单元测试中的HostBuilder:HostContext.Configuration.GetSection返回值null

时间:2020-06-09 14:20:57

标签: c# .net-core

我正尝试通过以下方式在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.Valuenull(激发了Assert)。如果我调试代码,我可以看到hostContext.Configuration有一个JsonConfigurationProvider,它已经解析了appsettings.json中定义的适当值。

环境: netcoreapp3.1

Update1:​​:我已将源代码上传到Github

任何帮助将不胜感激。

谢谢。

2 个答案:

答案 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);
})