【发布时间】:2019-10-13 22:19:25
【问题描述】:
我已经构建了一个自定义 Web 应用程序工厂来运行内存测试服务器以进行集成测试。我们尝试使用 sql 数据库,而不是使用内存数据库。
我的问题是每个环境的连接字符串都在变化。我们有几个带有连接字符串的 appsettings{envName}.json 文件。所以,我需要找到一个获取环境变量的解决方案。这些是我的尝试:
public class CustomWebApplicationSQLServerFactory<TStartup> : WebApplicationFactory<TStartup> where TStartup : class
{
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.ConfigureServices(services =>
{
var serviceProvider = new ServiceCollection()
.AddEntityFrameworkSqlServer()
.BuildServiceProvider();
var env = serviceProvider.GetService<IHostingEnvironment>();
Configuration = new ConfigurationBuilder()
.SetBasePath(AppContext.BaseDirectory)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables()
.Build();
var defaultConnection = Configuration.GetConnectionString("DefaultConnection");
var connectionString = string.Format(defaultConnection, "TestSampleOrder_" + Guid.NewGuid().ToString());
services.AddDbContext<SampleOrderContext>(options =>
{
options.UseSqlServer(connectionString);
options.UseInternalServiceProvider(serviceProvider);
});
var sp = services.BuildServiceProvider();
using (var scope = sp.CreateScope())
{
var scopedServices = scope.ServiceProvider;
var context = scopedServices.GetRequiredService<SampleOrderContext>();
DbInitializer.InitializeDbForTests(context);
}
});
}
我还在我的测试项目中添加了一个launchSettings.json 文件。在该文件中,在我的测试项目名称下,我添加了“ASPNETCORE_ENVIRONMENT”:“AnyValue”。所以,我不明白为什么env = null。做了更多的测试,env.EnvironmentName = "Development",应用名称和路径是主Project。为什么?孔解中未设置“开发”字样。
我也试过替换这个的 env 行:
var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
如果我设置了一个 Windows 变量,我可以使用它来获取值,但我需要了解如何在我的 launchSettings 文件中设置变量的值。
我尝试过的另一件事是:
var serviceProvider = services.BuildServiceProvider();
但我真的不明白其中的区别。
谁能帮我理解这是如何工作的,获取环境变量的最佳方法是什么以及使用 services.BuildServiceProvider() 和 new ServiceCollection() 之间的区别是什么?
非常感谢。
【问题讨论】:
-
你确定你需要测试吗?
Environment.GetEnvironmentVariable失败的唯一方法是 .NET Core 本身已损坏。envName只是一个字符串。它可以来自任何地方 - 对Environment.GetEnvironmentVariable的调用、命令行参数或传递给您的方法的参数。 -
无论如何,
var env = serviceProvider.GetService<IHostingEnvironment>();表示IHostingEnvironment类本身就是一个依赖项。您可以在返回硬编码环境名称的测试中注册自己的IHostingEnvironment实现 -
如何运行这个 Web 应用程序? dotnet cli 还是 Visual Studio?
-
我正在使用 Visual Studio 运行它
-
我已经编辑了我的问题。我的环境变量有“发展”数据。我在 Windows 中没有环境变量,在任何带有“开发”设置的 launchSettings.json 中也没有条目。事实上,即使在解决方案中进行了一次完整的搜索,也没有找到“开发”这个词。
标签: c# .net-core environment-variables integration-testing