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