2017-05-12 8 views
7

プロジェクトプロパティページを使用してVisual Studio 2017で.Net Core Webプロジェクトの環境変数を設定すると、Environment.GetEnvironmentVariableを使用して変数の値を読み取ることができます。ただし、xUnitテストプロジェクトの環境変数を設定してからテストをデバッグすると、Environment.GetEnvironmentVariableは常にnullを返します。変数がWebプロジェクトと同じように使用されないようにするテストプロジェクトであるという事実について何かありますか?もしそうなら、テストプロジェクトの環境変数を設定する方法はありますか?ありがとうございました。xUnit TestでGetEnvironmentVariableを使用する必要がありますか?

+2

テストプロジェクトの環境変数の設定方法を示してください。 –

+0

@Ilya、方法を知っていればスクリーンショットを追加します。 Visual Studio 2017で、単体テストプロジェクトの[プロパティ]ウィンドウを開きます。 [デバッグ]タブには、環境変数を入力できるグリッドがあります。カスタムプロジェクトをWebプロジェクトに追加すると、デバッグしているときに読み込むことができますが、単体テストプロジェクトで設定すると値はnullになります。 – Eric

答えて

9

GetEnvironmentVariableはxUnitテストでうまく動作します。 問題は、変数を正しく設定することです。変数をProperties -> Debugページに設定すると、変数はProperties\launchSettings.jsonに書き込まれ、Visual Studioは選択したプロファイルですべての作業を開始します。ご覧のように、デフォルトではlaunchSettings.jsonも出力フォルダにコピーされません。このファイルをdotnet runまたはdotnet testへの引数として渡すことは不可能です。これは、テストがCIサーバー上で自動的に実行されると明らかに問題になります。したがって、launchSettings.jsonがテストランナーによって考慮されないことは驚くことではありません。

ソリューション

  • コンストラクタ
  • 基本クラス
  • Fixture

たとえば、このコレクション器具:セットアップする方法の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 
    } 
} 

はテストからファイルにアクセスできるようにlaunchSettings.jsonためCopy to output directory: Alwaysを設定します。

+0

素晴らしいソリューション@Ilya。投稿していただきありがとうございます。私はlaunchSettings.jsonファイルについても知らなかった。 – Eric

+0

@エリック、ありがとうございました。実際には、テスト環境をセットアップするために 'launchsettings.json'を使用しません。代わりに、単純化された単一のjson Key-Valueファイルを作成します。ソリューション内のすべての統合テストプロジェクトのリンクとして共有されています。複数の環境/プロファイルを保持する必要がある場合は、ASP.NET Coreの 'appsettings.json'のようにconfigトランスフォームを考慮してください。 –

関連する問題