【问题标题】:HostBuilder in Unit Test: HostContext.Configuration.GetSection returns value null单元测试中的 HostBuilder:HostContext.Configuration.GetSection 返回值 null
【发布时间】:2020-06-09 14:20:57
【问题描述】:

我正在尝试通过以下方式在MsTest 测试用例中使用HostBuilder 类:

        [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.ValuenullAssert 被触发)。如果我调试代码,我可以看到hostContext.Configuration 有一个JsonConfigurationProvider,它已经解析了appsettings.json 中定义的适当值。

环境: netcoreapp3.1

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

任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 您的测试项目中有appsettings.json 文件吗?确保在appsettings.json 的文件属性中选择“如果较新则复制”或“始终复制”。
  • 是的,它在项目中,否则“AddJsonFile”会抛出异常。
  • 也复制了。

标签: c# .net-core


【解决方案1】:

不确定您是否能够解决此问题,但我也遇到了类似的问题!我是如何解决这个问题的,在检查 appsettings.json 属性时,似乎这个文件的默认操作从来没有。因此,当项目在目标文件夹中构建时,appsettings.json 文件永远不会被复制。将此设置更改为“始终复制”或“如果更新则复制”解决了它,现在我在目标执行文件夹中获得了更新的 json 文件。

上面的代码看起来不错——我的非常相似。

要测试这是否确实是您遇到的问题,请更改

config.AddJsonFile("appsettings.json", optional: true);

config.AddJsonFile("appsettings.json", optional: false);

如果文件不存在,这将强制应用程序失败。这也是我在很长一段时间后发现问题的方式。

要检查此文件的属性,请在解决方案资源管理器上右键单击它并选择属性。在默认的 VS 2019 中,属性面板位于解决方案资源管理器的正下方。

【讨论】:

    【解决方案2】:

    就我而言,我是从 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);
    })
    

    【讨论】:

      猜你喜欢
      • 2020-11-02
      • 1970-01-01
      • 2020-06-14
      • 2017-11-03
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多