2011-09-12 13 views
2

私は現在、バッチファイルとそれに付随するユニット/統合テストをたくさん書いています。マシンレベルのWindows環境変数のユニットテスト

しかし、バッチファイルの1つが環境変数を設定することになっています。私の知る限りは、マシンレベルで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の存在を確認すると、期待値に設定されています。

コードは機能しますが、正しくチェックするテストを設計することはできません。テストで環境変数の値を取得できるようにするためにできることはありますか?

乾杯、 マット

答えて

0

OKは、フープを介してジャンプするビットが、ここでこの質問を見つけた誰のためにそれを行うことができる方法です。

あなたはpowershellが必要ですが、それはVistaからWindowsの箱の外にあるので、問題ではありません。

環境変数を設定し、PowerShellのファイルを作成します。バッチファイルからのことを実行し

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

を:

powershell.exe SetEnvironmentVariable.ps1 

し、テストに合格します。 CMDについては、プロセスが閉じられるまで変数はまだ存在しませんが、PowerShellを使用して環境変数を設定する場合は、C#がチェックするために使用するのと同じクラスを使用してC#を使用しますそれを拾うことができる。

乾杯、 マット

0

通常の環境変数が継承され、それはあなたのプロセスは、プロセスが開始された現在の変数だけを見ていることを意味します。

(レジストリ内であっても)既存の環境変数の変更は、新しいプロセスにのみ適用できます。