Должен ли GetEnvironmentVariable работать в xUnit Test?

Если я установил переменные среды для веб-проекта.Net Core в Visual Studio 2017, используя страницу свойств проекта, я могу прочитать значение переменной, используя Environment.GetEnvironmentVariable; однако, когда я устанавливаю переменную среды для моего проекта тестирования xUnit и затем отлаживаю тест, Environment.GetEnvironmentVariable всегда возвращает null. Есть ли что-то в том, что это проект тестирования, который должен препятствовать тому, чтобы переменная использовалась так же, как и с веб-проектом? Если да, то можно ли установить переменные среды для тестового проекта? Спасибо.

Ответ 1

GetEnvironmentVariable отлично работает в тестах xUnit. Проблема состоит в том, чтобы правильно установить переменную. Если вы установите переменную на странице Properties → Debug, переменная будет записана в " Properties\launchSettings.json а Visual Studio запустит все приложения для запуска приложения с выбранным профилем. Как вы могли видеть, launchSettings.json даже не копируется в папку вывода по умолчанию. Невозможно передать этот файл в качестве аргумента для dotnet run или dotnet test, что приводит к очевидной проблеме, если тесты запускаются автоматически на сервере CI. Поэтому неудивительно, что launchSettings.json не рассматривается тестировщиком.

Решение. Существует множество способов настройки тестовой среды в xUnit:

Например, этот набор инструментов устанавливает все переменные среды из launchSettings.json:

public class LaunchSettingsFixture : IDisposable
{
    public LaunchSettingsFixture()
    {
        using (var file = File.OpenText("Properties\\launchSettings.json"))
        {
            var reader = new JsonTextReader(file);
            var jObject = JObject.Load(reader);

            var variables = jObject
                .GetValue("profiles")
                //select a proper profile here
                .SelectMany(profiles => profiles.Children())
                .SelectMany(profile => profile.Children<JProperty>())
                .Where(prop => prop.Name == "environmentVariables")
                .SelectMany(prop => prop.Value.Children<JProperty>())
                .ToList();

            foreach (var variable in variables)
            {
                Environment.SetEnvironmentVariable(variable.Name, variable.Value.ToString());
            }
        }
    }

    public void Dispose()
    {
        // ... clean up
    }
}

Установите Copy to output directory: Always для launchSettings.json чтобы сделать файл доступным из тестов.