Переменные среды C # в интеграционном тесте - PullRequest
0 голосов
/ 28 мая 2019

Я создал собственную фабрику веб-приложений для запуска тестового сервера в памяти для интеграционных тестов.Вместо того, чтобы использовать базу данных в памяти, мы пытаемся использовать базу данных 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 ()?

Большое спасибо.

1 Ответ

0 голосов
/ 29 мая 2019

Возможно этот вопрос может дать некоторое представление.

При этом самый простой способ тестирования конфигурации - это абстрагирование того, что вам нужно. Может быть, вы могли бы создать адаптер, который дает вам имя среды, например:

public interface IApplicationConfiguration
{
    string GetEnvironmentName();
}

public class ApplicationConfiguration
{
    private IHostingEnvironment _hostingConfiguration;

    public ApplicationConfiguration(IHostingEnvironment hostingConfiguration)
    {
        _hostingConfiguration = hostingConfiguration;
    }

    public string GetEnvironmentName()
    {
        return _hostingConfiguration.EnvironmentName;
    }
}

Вы можете решить эту проблему, используя другие опции, но насмешка над настройками такого типа может быть весьма полезна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...