The GetEnvironmentVariable
works fine in xUnit tests. The problem is to properly set a variable. If you set the variable at Properties -> Debug
page, then the variable is written to PropertieslaunchSettings.json
and Visual Studio makes all work to launch an application with the selected profile. As you could see, launchSettings.json
even isn't copied to output folder by default. It's impossible to pass this file as argument to dotnet run
or dotnet test
, that leads to obvious problem if tests are runned automatically on a CI server. So it is not surprising that launchSettings.json
isn't considered by a test runner.
Solution: there are a lot of ways to setup a test environment in xUnit:
For example, this collection fixture sets up all environment variables from 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
}
}
Set Copy to output directory: Always
for launchSettings.json
to make the file accessible from tests.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…