GetEnvironmentVariable应该在xUnit Test中工作吗?

时间:2017-05-12 01:31:08

标签: visual-studio .net-core visual-studio-2017 xunit.net

如果我使用项目属性页面在Visual Studio 2017中为.Net Core Web项目设置环境变量,我可以使用Environment.GetEnvironmentVariable读取变量的值;但是,当我为xUnit测试项目设置环境变量然后调试测试时,Environment.GetEnvironmentVariable总是返回null。是否存在一个事实,即它是一个测试项目,应该阻止变量与Web项目一样使用?如果是这样,有没有办法可以为测试项目设置环境变量?谢谢。

2 个答案:

答案 0 :(得分:36)

GetEnvironmentVariable在xUnit测试中正常工作。 问题是正确设置变量。如果将变量设置为Properties -> Debug页面,则该变量将写入Properties\launchSettings.json,Visual Studio将使用所选配置文件启动应用程序。如您所见,默认情况下,launchSettings.json甚至不会复制到输出文件夹。将此文件作为参数传递给dotnet rundotnet test是不可能的,如果在CI服务器上自动运行测试,则会导致明显的问题。因此,launchSettings.json没有被测试运动员考虑也就不足为奇了。

解决方案:有很多方法可以在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以使文件可以通过测试访问。

答案 1 :(得分:0)

在 mstest 或 xunittest 单元测试中使用环境变量的解决方案是通过为平台提供的“.runsettings”文件:

  1. 在项目中添加一个扩展名为 .runsettings 的文件:

Project Structure

  1. 在创建的文件“xxx.runsettings”中配置环境变量:
<块引用>
<!-- File name extension must be .runsettings -->
<RunSettings>
  <RunConfiguration>
      <EnvironmentVariables>
          <!-- List of environment variables we want to set-->
          <VARIABLE_XXXX>value X</VARIABLE_XXXX>
          <VARIABLE_YYYY>value Y</VARIABLE_YYYY>
      </EnvironmentVariables>
  </RunConfiguration>
</RunSettings>
  1. 在测试 .csproj 中添加 RunSettingsFilePath 标记,指向 .runsettings 文件。
<块引用>

重要提示:路径是绝对的。

使用 $(MSBuildProjectDirectory) 变量将返回项目目录的绝对路径。

enter image description here

使用 .runsettings 的另一个选项在下面的链接中:

<块引用>

https://docs.microsoft.com/pt-br/visualstudio/test/configure-unit-tests-by-using-a-dot-runsettings-file?view=vs-2019