我正在编写一些集成测试,我希望能够运行大约dotnet test --environment Test或类似的东西,在此基础上,我的集成测试将使用appsettings.ASPNETCORE_ENVIRONMENT.json并使用该文件中的配置?我怎么能做到这一点?

此外,如果这是可能的,是否可以在Visual Studio中的环境之间进行切换?

public class AppFactory : WebApplicationFactory<IAssemblyMarker>, IAsyncLifetime
{
    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        builder.ConfigureAppConfiguration((ctx, builder) =>
        {
            builder.Sources.Clear();
            var defaultSettings = new Dictionary<string, string?>
            {
                { "ConnectionStrings:Database", "Server=localhost,1433;Database=mydb;User Id=user;Password=user;Encrypt=False;" }
            };
            builder.AddInMemoryCollection(defaultSettings);

            // How do I load appsettings.Test.json or appsettings.Whatever.json that would override whatever my InMemoryCollection has specified?
        });
    }
}

推荐答案

dotnet test允许通过-e|--environment <NAME="VALUE"> option传递以=分隔的环境变量:

设置环境变量的值.如果变量不存在,则创建该变量;如果变量存在,则重写该变量.使用此选项将强制在独立进程中运行测试.可以多次指定该选项以提供多个变量.

dotnet test -e ASPNETCORE_ENVIRONMENT=Test

这将导致ASPNETCORE_ENVIRONMENT设置为Test.请注意,根据使用的框架版本和设置,您可能需要指定DOTNET_ENVIRONMENT,因为它覆盖了ASPNETCORE_ENVIRONMENT(参见Use multiple environments in ASP.NET Core文档)

由于您正在清除配置源,因此可以只添加回JSON文件:

builder
    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: false)
    .AddJsonFile($"appsettings.{ctx.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: false);

Csharp相关问答推荐

System.Data.SQLite:判断SQLite数据库是否为空(任何表中至少有一行)

Regex在c#中完全匹配

MudBlazor—MudDataGrid—默认过滤器定义不允许用户修改基本过滤器

在允许溢出的情况下将小数转换为长

JSON空引用异常仅在调试器中忽略try-Catch块,但在其他上下文中捕获得很好

如何使用EF Core和.NET 8来upsert到具有多对多关系的表?

net中从位图获取坐标和绘制折线

当试图限制EF Select 的列时,如何避免重复代码?

LINQ to Entities中的加权平均值

VS 2022与VS 2019:如何/为什么创建额外的任务?

MudBlazor Textfield已禁用,但其验证工作正常

我应该为C#12中的主构造函数参数创建私有属性吗?

使用可空引用类型时C#接口实现错误

正在try 将自定义字体添加到我的控制台应用程序

C#USB条形码 scanner 在第二次扫描时未写入行尾字符

从MudAutoComplete打开对话框,列表仍然可见

处理方法内部过滤与外部过滤

当我在Git中暂存文件更改时,它们会消失

在Swagger中显示自定义属性的属性名称

是否在异步方法中避免Span<;T>;.ToArray()?