使用WebApplicationFactory,在Program.cs执行之前添加配置源

Kri*_*lén 13 .net integration-testing

我正在使用新的最小 .NET 6 托管模型,并且进行了集成测试。

显然Program.cs需要配置值,所以我想使用自定义appsettings.Test.json文件。文档说我可以使用ConfigureAppConfiguration,但它的委托在之后运行Program,因此Program没有配置。以下是添加到Minimal API Playground 示例代码中的代码:

internal class PlaygroundApplication : WebApplicationFactory<Program>
{
    private readonly string _environment;

    public PlaygroundApplication(string environment = "Development")
    {
        _environment = environment;
    }

    protected override IHost CreateHost(IHostBuilder builder)
    {
        builder.UseEnvironment(_environment);

        builder.ConfigureAppConfiguration(config =>
        {
            config.AddJsonFile(appSettings); // runs AFTER Program.cs
        });

        // Add mock/test services to the builder here
        builder.ConfigureServices(services =>
        {
        });

        return base.CreateHost(builder);
    }
}
Run Code Online (Sandbox Code Playgroud)

我如何向 提供配置Program.cs

var builder = WebApplication.CreateBuilder(args);

var keyVaultName = builder.Configuration["KeyVaultName"]; // null

builder.Configuration.AddAzureKeyVault(new SecretClient(
    new Uri($"https://{keyVaultName}.vault.azure.net/"),
    new DefaultAzureCredential()), new KeyVaultSecretManager());
Run Code Online (Sandbox Code Playgroud)

我可以将环境设置为Test,然后在程序中执行以下操作:

var builder = WebApplication.CreateBuilder(args);

builder.Configuration.AddJsonFile($"appsettings.{builder.Environment.EnvironmentName}.json");

var keyVaultName = builder.Configuration["KeyVaultName"]; // has value from json

builder.Configuration.AddAzureKeyVault(new SecretClient(
    new Uri($"https://{keyVaultName}.vault.azure.net/"),
    new DefaultAzureCredential()), new KeyVaultSecretManager());

Run Code Online (Sandbox Code Playgroud)

但这是正确的吗?

Kri*_*lén 5

不幸的是,根据https://github.com/dotnet/aspnetcore/issues/37680 ,目前代码的编写方式是不可能的。