Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Should GetEnvironmentVariable Work in xUnit Test?

If I set environment variables for a .Net Core web project in Visual Studio 2017 using the project properties page, I can read the value of the variable using Environment.GetEnvironmentVariable; however, when I set the environment variable for my xUnit testing project and then debug the test, Environment.GetEnvironmentVariable always returns null. Is there something about the fact that it is a testing project that should prevent the variable from being used the same as with the web project? If so, is there a way that I can set the environment variables for a test project? Thank you.

like image 302
Eric Avatar asked May 12 '17 01:05

Eric


People also ask

What xUnit test type should you use to test an invariant condition?

Note that xUnit.net supports two types of unit tests: facts and theories. While facts are used to test invariant conditions, theories are tests that are true for a particular set of data passed as argument to the method. You would typically use the [Fact] attribute to write unit tests that have no method arguments.

Does xUnit work with .net 5?

Sometimes, you want to write tests and ensure they run against several target application platforms. The xUnit.net test runner that we've been using supports . NET Core 1.0 or later, . NET 5.0 or later, and .

Which attribute is used to mark a method as test method in xUnit?

Testing a positive case This method is decorated with the Fact attribute, which tells xUnit that this is a test.


1 Answers

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 Properties\launchSettings.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:

  • Constructor
  • Base class
  • Fixture

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.

like image 188
Ilya Chumakov Avatar answered Oct 06 '22 07:10

Ilya Chumakov