【问题标题】:With WebApplicationFactory, add configuration source before Program.cs executes使用 WebApplicationFactory,在 Program.cs 执行之前添加配置源
【发布时间】:2021-11-16 09:27:07
【问题描述】:

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

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

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);
    }
}

如何向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());

我可以将环境设置为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());

但是这样对吗?

【问题讨论】:

    标签: .net integration-testing


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我在这里找到了一个解决方法:https://github.com/dotnet/aspnetcore/issues/37680#issuecomment-1032922656

      如果您在调用base.CreateHost() 之前覆盖WebApplicationFactory&lt;T&gt;.CreateHost() 并调用IHostBuilder.ConfigureHostConfiguration(),则您添加的配置将在WebApplication.CreateBuilder()builder.Build() 之间可见。根据我的测试,它在您查看配置的所有不同位置(回调等)都可见。

      【讨论】:

      • 你的解决方案对我不起作用
      猜你喜欢
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多