gpt4 book ai didi

c# - 将测试项目 appSettings 附加到 ASP.NET Core 集成测试

转载 作者:行者123 更新时间:2023-11-30 14:45:27 35 4
gpt4 key购买 nike

我正在按照 these docs 创建 ASP.NET Core 集成测试(基于 xUnit) .我想用它自己的 appsettings.json 启动测试 Web 服务器。我的缩写文件夹结构是:

\SampleAspNetWithEfCore
\SampleAspNetWithEfCore\SampleAspNetWithEfCore.csproj
\SampleAspNetWithEfCore\Startup.cs
\SampleAspNetWithEfCore\appsettings.json
\SampleAspNetWithEfCore\Controllers\*

\SampleAspNetWithEfCore.Tests\SampleAspNetWithEfCore.Tests.csproj
\SampleAspNetWithEfCore.Tests\IntegrationTests.cs
\SampleAspNetWithEfCore.Tests\appsettings.json

然后我有这些实用程序:

public static class ServicesExtensions
{
public static T AddOptions<T>(this IServiceCollection services, IConfigurationSection section)
where T : class, new()
{
services.Configure<T>(section);
services.AddSingleton(provider => provider.GetRequiredService<IOptions<T>>().Value);

return section.Get<T>();
}
}

Startup.cs ConfigureServices(...) 我这样做:

services.AddOptions<SystemOptions>(Configuration.GetSection("System"));

像这样引用 appsettings.json 部分:

"System": {
"PingMessageSuffix": " suffix-from-actual-project"
}

到目前为止一切顺利:这是以强类型方式获取的。我的 Controller 获得了一个 SystemOptions 实例,该实例反射(reflect)了 json 结构,并且 Controller 使用后缀正确。

问题在于构建集成测试 WebHost。我想按原样从我的真实项目运行 Startup,它有自己的 appsettings.json 设置,但作为额外的设置层,我想要 appsettings。添加来 self 的测试 csproj 的 json ,如果适用,覆盖任何设置。这是我在测试项目中的应用设置:

"System": {
"PingMessageSuffix": " suffix-from-test-appsettings"
}

这是我尝试过的:

public class CustomWebApplicationFactory : WebApplicationFactory<Startup>
{
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder
.UseStartup<Startup>()
.ConfigureAppConfiguration(config => config
.AddJsonFile("appsettings.json")
);
}
}

但是,这是行不通的。如果我在 Controller 中遇到断点,我只会看到基础项目的设置。 controller只是回显当前的config值,逻辑上返回结果也不如预期。

The documentation没有在页面上的任何地方提到“appsettings”。

底线:如何在运行 ASP.NET Core 集成测试时从测试项目的 appsettings.json 文件中添加一层 appSettings?

最佳答案

这样解决的:

  1. 为测试项目中的 appsettings.json 设置属性:
    • 构建操作内容
    • Copy to Output DirectoryCopy if newer
  2. 像这样使用自定义 WebApplicationFactory:

    public class CustomWebApplicationFactory : WebApplicationFactory<Startup>
    {
    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
    var configuration = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json")
    .Build();

    // Note: ↓↓↓↓
    builder.ConfigureTestServices(services =>
    services.AddOptions<SystemOptions>(configuration.GetSection("System"))
    );
    }
    }

瞧:它起作用了!

第一步是让 ConfigurationBuilder 轻松找到您的 json 文件。第二步巧妙地使用了 ...TestServices 配置(如果您使用常规的 ConfigureServices 方法,它将在启动服务配置之前被调用并被覆盖)。

脚注:评论者(关于这个问题)提到在 SUT 项目中有一个 appsettings.ci.json 文件可能会更好,并通过环境控制事物(您可以通过启动设置或通过 WebHostBuilder 进行设置)。该文档链接到一些暗示相同内容的已关闭 GitHub 问题:8712 , 9060 , 7153 .根据您的场景和品味,这可能是更好或更惯用的解决方案。

关于c# - 将测试项目 appSettings 附加到 ASP.NET Core 集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53704407/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com