机器级窗口环境变量的单元测试

时间:2011-09-12 10:16:34

标签: .net batch-file environment-variables dos

我目前正在编写一堆批处理文件,并附带单元/集成测试,以确保它们具有所需的效果。

但是其中一个批处理文件应该设置一个环境变量。据我所知,在机器级别在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”)为空。

我对这种行为感到有些困惑。因为我在运行批处理文件的进程上调用WaitForExit,所以当我的Assertion被调用时,批处理已经完成执行并且应该设置环境变量?如果在测试失败后打开一个新的dos窗口并检查是否存在My_Variable_Name,则将其设置为预期值。

所以代码可以工作,但是我无法设计一个能够正确检查它的测试。有什么我可以做的,以便测试能够获取环境变量的值吗?

干杯, 马特

2 个答案:

答案 0 :(得分:0)

好的,有点跳过篮球,但是这里有你如何能够找到这个问题的其他人。

你需要PowerShell,但是从Vista开始就是开箱即用的,所以不应该是一个问题。

创建一个设置环境变量的powershell文件:

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

然后从批处理文件中运行它:

 powershell.exe SetEnvironmentVariable.ps1

然后测试将通过。就CMD而言,变量在流程关闭之前仍然不存在,但是 - 出于逃避我的原因 - 如果使用PowerShell使用c#用来检查它的相同类来设置Environment变量,那么c#是能够接受它。

干杯, 马特

答案 1 :(得分:0)

通常环境变量是继承的,这意味着您的流程只会看到流程启动时出现的变量。

对现有环境变量的更改(即使在注册表中)也只能应用于新进程。