带有 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.json
、appsettings.Stage.json
、appsettings.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"));
我正在为我的公司设置集成测试。每个开发人员都将拥有自己的“集成测试”数据库。我的目标是将连接字符串放入 .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.json
、appsettings.Stage.json
、appsettings.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"));