如果我使用项目属性页面在Visual Studio 2017中为.Net Core Web项目设置环境变量,我可以使用Environment.GetEnvironmentVariable
读取变量的值;但是,当我为xUnit测试项目设置环境变量然后调试测试时,Environment.GetEnvironmentVariable
总是返回null。是否存在一个事实,即它是一个测试项目,应该阻止变量与Web项目一样使用?如果是这样,有没有办法可以为测试项目设置环境变量?谢谢。
答案 0 :(得分:36)
GetEnvironmentVariable
在xUnit测试中正常工作。 问题是正确设置变量。如果将变量设置为Properties -> Debug
页面,则该变量将写入Properties\launchSettings.json
,Visual Studio将使用所选配置文件启动应用程序。如您所见,默认情况下,launchSettings.json
甚至不会复制到输出文件夹。将此文件作为参数传递给dotnet run
或dotnet 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”文件:
<!-- 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>
重要提示:路径是绝对的。
使用 $(MSBuildProjectDirectory) 变量将返回项目目录的绝对路径。
使用 .runsettings 的另一个选项在下面的链接中:
<块引用>