web-dev-qa-db-ja.com

GetEnvironmentVariableはxUnitテストで動作する必要がありますか?

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

24
Eric

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

Solution: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: AlwayslaunchSettings.jsonを設定して、テストからファイルにアクセスできるようにします。

39
Ilya Chumakov