.NET 7 从单元测试中从 appsettings 加载的数组中删除空字符串

问题描述 投票:0回答:1

在appsettings中有一个数组,里面有一个空字符串。我运行 API 并通过调用

config.GetSection("AppSettings").GetSection("Mapping").Get<string[][]>()

获取值

本例的结果很好,一个有 2 个值的数组,里面都是 3 个值。

API 中的结果:

应用程序设置示例:

{
  "AppSettings": {
    "Mapping": [
      [ "yes", true, 1 ],
      [ "", false, -1 ]
    ]
  }
}

单元测试

问题出在单元测试上。我加载相同的应用程序设置,但带有空字符串的条目已被删除。

我将项目改回.NET 6,一切都很好。所以 .NET 7 中发生了一些变化,但我找不到什么以及如何防止它被删除。 以下单元测试是 IConfiguration 的两个实例。第一个configurationRoot工作正常,有2个条目,里面有3个条目,也是空字符串。第二个配置有 2 个条目,第二个条目只有 2 个条目,空字符串被删除,检查失败。

很奇怪,因为config的来源是configurationRoot。对我来说,这表明 ConfigurationRoot 的克隆在 TestServer 中已更改。就我而言,这很糟糕。

using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.TestHost;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Xunit;

namespace TestProject1
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            IConfigurationRoot configurationRoot = new ConfigurationBuilder()
                .AddJsonFile("UnitTestAppConfig.json")
                .Build();

            TestServer server = new(new WebHostBuilder()
                .UseEnvironment("Development")
                .UseConfiguration(configurationRoot)
                .UseStartup<Startup>()
            );
            IConfiguration? config = server.Services.GetService<IConfiguration>();

            string[][] mappingFromConfigBuilder = configurationRoot.GetSection("AppSettings").GetSection("Mapping").Get<string[][]>();
            string[][] mappingFromTestServer = config.GetSection("AppSettings").GetSection("Mapping").Get<string[][]>();

            Assert.Equal(2, mappingFromConfigBuilder.Length);
            Assert.Equal(2, mappingFromTestServer.Length);

            Assert.Equal(3, mappingFromConfigBuilder[1].Length);
            Assert.Equal(3, mappingFromTestServer[1].Length); // <= Fails here
        }
    }

    public class Startup
    {
        public Startup(IConfiguration configuration) { }
        public void Configure() { }
    }
}

使用过的 NuGet 包

  • Microsoft.AspNetCore.TestHost
  • Microsoft.NET.Test.Sdk
  • x单位
  • xunit.runner.visualstudio

我也尝试过旧版本的软件包,但没有效果。

有人知道我能做什么吗?我不会更改 API 中的源,工作正常,只是单元测试有问题。

感谢您的帮助。

c# unit-testing .net-7.0 appsettings
1个回答
0
投票

这是与WebHostBuilder相关的问题

由于您使用的是.net 7,您可以尝试不启动,例如:

TestServer server = new(IServiceProvider);
© www.soinside.com 2019 - 2024. All rights reserved.