带有 WebApplicationFactory 的 .env 文件

.env File With WebApplicationFactory

我正在为我的公司设置集成测试。每个开发人员都将拥有自己的“集成测试”数据库。我的目标是将连接字符串放入 .env 文件并将该文件放入 .gitignore 以便这些更改不受源代码控制。 当我尝试从我的 WebApplicationFactory 访问 .env 文件的内容时,变量为空。任何想法为什么会这样? 我会粘贴代码,如果有什么我可以澄清的,请告诉我

public class ApiWebApplicationFactory : WebApplicationFactory<Startup>
{
    public IConfiguration Configuration { get; private set; }

    protected override IHostBuilder CreateHostBuilder()
    {
        DotNetEnv.Env.Load();
        var builder = Host.CreateDefaultBuilder()
            .UseSerilog()
            .UseServiceProviderFactory(new AutofacServiceProviderFactory())
            .ConfigureWebHostDefaults(x => { x.UseStartup<Startup>().UseTestServer(); });
        return builder;
    }
    
    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        var devDb = Environment.GetEnvironmentVariable("DB_CONN");
        builder.UseEnvironment("IntegrationTest");
        Environment.SetEnvironmentVariable("DB_CONN",
            devDb);
        Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "IntegrationTest");
        // Is be called after the `ConfigureServices` from the Startup
        // which allows you to overwrite the DI with mocked instances
        builder.ConfigureTestServices(services =>
          {
              services.AddAuthentication("IntegrationTest")
                  .AddScheme<AuthenticationSchemeOptions, IntegrationTestAuthenticationHandler>("IntegrationTest",
                      options => { }
                  );
          });
    }
}

ConfigureWebHost 中的 var devDb 为空,为什么不填充它?!

首先,您应该使用 appsetting.json 并将连接字符串、日志记录配置等配置添加到此文件。不要将环境值用于连接字符串或其他应用程序级别的配置。您可以为不同的平台生成appsettings.Development.jsonappsettings.Stage.jsonappsettings.Production.json。完成后,当您将 ASPNETCORE_ENVIRONMENT 环境值更改为 Development 时,.NET 将自动从 appsettings.Development.json 读取值(连接字符串、日志配置等)。完成这些步骤后,您可以添加 appsettings json 您希望不受源代码控制的文件。

创建自定义应用程序设置文件以用于您的测试环境appsettings.test.json并设置连接字符串。

{
  "ConnectionStrings": {
    "DB_CONN": "Data Source...."
  }
}

设置IConfiguration读取WebApplicationFactory.CreateHostBuilder()中的json文件

 Configuration = new ConfigurationBuilder()
                .AddJsonFile("appsetting.test.json")
                .Build();

如果您的系统正在使用 appsettings 那么您可以在创建主机时添加它。

根据Configuration设置环境变量,可以在ConfigureWebHost(IWebHostBuilder builder)

中手动设置变量
 Environment.SetEnvironmentVariable("DB_CONN", Configuration.GetConnectionString("DB_CONN"));