在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 包
我也尝试过旧版本的软件包,但没有效果。
有人知道我能做什么吗?我不会更改 API 中的源,工作正常,只是单元测试有问题。
感谢您的帮助。
这是与WebHostBuilder相关的问题
由于您使用的是.net 7,您可以尝试不启动,例如:
TestServer server = new(IServiceProvider);