Модульный тест для переменной среды окон машинного уровня - PullRequest
2 голосов
/ 12 сентября 2011

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

Однако один из командных файлов должен устанавливать переменную среды.Насколько я могу сказать, единственный способ установить переменную окружения в DOS на уровне машины - это использовать команду SetX:

setX My_Variable_Name My_Variable_Value -m

И это делает то, что он должен.Но подвох заключается в том, что, поскольку это изменяет реестр, переменная среды не распознается как установленная до тех пор, пока не закроется окно DOS.Итак, соответствующий бит моего кода, который запускает пакетный файл, выглядит следующим образом:

        ProcessStartInfo p = new System.Diagnostics.ProcessStartInfo(filePath + fileToRun);
        p.WorkingDirectory = filePath;
        Process proc = new System.Diagnostics.Process();
        proc.StartInfo = p;

        proc.Start();
        proc.WaitForExit();

А затем, после того как он был вызван в модульном тесте, я проверяю переменную среды следующим образом:

 Assert.AreSame("My_Variable_Value", Environment.GetEnvironmentVariable("My_Variable_Name"), "Primary Customers Server Name improperly set");

Но это не помогло - пошаговое выполнение с помощью QuickWatch показывает, что Environment.GetEnvironmentVariable ("My_Variable_Name") имеет значение null.

Я несколько смущен этим поведением.Так как я вызываю WaitForExit для процесса, который запускает пакетный файл, конечно, к тому времени, когда мое Утверждение вызывается, пакет будет завершен, и должна быть установлена ​​переменная среды?И если вы откроете новое окно dos после провала теста и проверите существование My_Variable_Name, для него будет установлено ожидаемое значение.

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

Cheers, Matt

Ответы [ 2 ]

0 голосов
/ 13 сентября 2011

Обычно переменные среды наследуются, это означает, что ваш процесс видит только те переменные, которые присутствуют при запуске процесса.

Изменения в существующих переменных среды (даже в реестре) могут применяться только к новым процессам.

0 голосов
/ 12 сентября 2011

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

Вам нужна PowerShell, но она не входит в стандартную комплектацию Windows с Vista, поэтому проблем не должно быть.

Создайте файл powershell, который устанавливает переменную среды:

$MyVariable = "My_Variable_Value"
[Environment]::SetEnvironmentVariable("My_Variable_Name", $MyVariable, "Machine")

Затем запустите это из командного файла:

 powershell.exe SetEnvironmentVariable.ps1

И тогда тест пройдёт. Что касается CMD, то переменная все еще не существует до тех пор, пока процесс не будет закрыт, но - по причинам, которые меня избегают - если вы используете PowerShell для установки переменной Environment, используя тот же класс, который использует c # для ее проверки, тогда c # в состоянии поднять его.

Cheers, Matt

...