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