Я создал собственную фабрику веб-приложений для запуска тестового сервера в памяти для интеграционных тестов.Вместо того, чтобы использовать базу данных в памяти, мы пытаемся использовать базу данных sql.
Моя проблема заключается в том, что строка подключения меняется для каждой среды.У нас есть несколько файлов appsettings {envName} .json со строкой подключения.Итак, мне нужно найти решение для получения переменной env.Это мои попытки:
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", а также имя приложения и путь к нему являются основным проектом.Зачем?Слово «Разработка» НЕ установлено в решении для отверстия.
Я попытался также заменить строку env на эту:
var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
Если я установлю переменную Windows, я смогу получить значениеиспользуя это, но мне нужно понять, как я могу установить значение переменной в моем файле launchSettings.
Еще одна вещь, которую я попробовал, это:
var serviceProvider = services.BuildServiceProvider();
Но я действительно неЯ не могу понять разницу.
Может кто-нибудь помочь мне понять, как это работает, как лучше всего получить переменную env и в чем разница между использованием services.BuildServiceProvider () и новой ServiceCollection ()?
Большое спасибо.