我正在开发一个在解决方案中具有测试项目的库。该库使用了.NET Universe中的多个框架(例如net462或netcoreapp2.0),并且运行良好。该测试项目当前使用netcoreapp2.1以及最新的NUnit框架和测试运行程序。
我有一些测试,这些测试依赖于测试项目中包含的文件,并在构建过程中复制到输出文件夹中。当测试项目使用.NET Core作为目标框架时,将找到文件并通过测试。当测试项目使用除.NET Core以外的任何内容时(我没有测试所有.NET Framework版本,而是某些版本),则找不到文件,并且测试失败。
不使用.NET Core时,测试运行程序的工作目录似乎位于C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\
上,而不是项目的输出目录。
这是不起作用的项目文件
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net461</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<OutputPath>bin\Release\</OutputPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<OutputPath>bin\Debug\</OutputPath>
</PropertyGroup>
<PropertyGroup>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.8.0" />
<PackageReference Include="NUnit" Version="3.10.1" />
<PackageReference Include="NUnit3TestAdapter" Version="3.10.0" />
</ItemGroup>
</Project>
这是工作项目文件
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<OutputPath>bin\Release\</OutputPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<OutputPath>bin\Debug\</OutputPath>
</PropertyGroup>
<PropertyGroup>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.8.0" />
<PackageReference Include="NUnit" Version="3.10.1" />
<PackageReference Include="NUnit3TestAdapter" Version="3.10.0" />
</ItemGroup>
</Project>
有人对此行为有更多了解吗?我该如何解决?
答案 0 :(得分:0)
如所引用问题中所述,NUnit根本不更改当前工作目录。这是设计使然,基于这样的观念:库程序永远不要更改cd,而应保留调用程序设置的cd。
在.NET Core项目的情况下,运行器或Visual Studio本身更改目录可能有原因。我不知道它们是什么,但我确实知道NUnit不这样做。
显而易见的解决方法是在测试中使用TestContext.TestDirectory
。为此,它由NUnit提供。请注意,它仅在测试代码中有效。如果您需要测试代码之外的类似内容,则可以从TestContext.TestDirectory
复制经过良好测试的逻辑。