NUnit TestRunner 工作目录因项目的目标框架而异
NUnit TestRunner working directory is different depending on target framework of project
我正在开发一个库,该库在解决方案中有一个测试项目。该库使用 .NET 世界中的几个框架(如 net462 或 netcoreapp2.0)并且工作正常。测试项目目前使用的是netcoreapp2.1和最新的NUnit框架和test runner
我的测试依赖于测试项目中包含的文件,这些文件在构建过程中被复制到输出文件夹。当测试项目使用 .NET Core 作为目标框架时,找到文件并通过测试。当测试项目使用 .NET Core 以外的任何东西时(我没有测试所有 .NET Framework 版本,但测试了一些),找不到文件并且测试失败。
当不使用 .NET Core 时,测试运行器的工作目录似乎位于 C:\Program Files (x86)\Microsoft Visual Studio17\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>
有没有人知道更多关于这种行为的信息?我该如何解决这个问题?
如引用问题中所述,NUnit 根本不更改当前工作目录。这是设计使然,基于库程序永远不应更改 cd 而应将其保留为调用程序设置的概念。
在 .NET Core 项目的情况下,运行器或 Visual Studio 本身可能会更改目录。我不知道它们是什么,但我知道 NUnit 不会这样做。
明显的解决方法是在测试中使用 TestContext.TestDirectory
。它由 NUnit 为此目的提供。请注意,它 仅 在测试代码中有效。如果您在测试代码之外需要类似的东西,您可以从 TestContext.TestDirectory
复制逻辑,它已经经过很好的测试。
我正在开发一个库,该库在解决方案中有一个测试项目。该库使用 .NET 世界中的几个框架(如 net462 或 netcoreapp2.0)并且工作正常。测试项目目前使用的是netcoreapp2.1和最新的NUnit框架和test runner
我的测试依赖于测试项目中包含的文件,这些文件在构建过程中被复制到输出文件夹。当测试项目使用 .NET Core 作为目标框架时,找到文件并通过测试。当测试项目使用 .NET Core 以外的任何东西时(我没有测试所有 .NET Framework 版本,但测试了一些),找不到文件并且测试失败。
当不使用 .NET Core 时,测试运行器的工作目录似乎位于 C:\Program Files (x86)\Microsoft Visual Studio17\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>
有没有人知道更多关于这种行为的信息?我该如何解决这个问题?
如引用问题中所述,NUnit 根本不更改当前工作目录。这是设计使然,基于库程序永远不应更改 cd 而应将其保留为调用程序设置的概念。
在 .NET Core 项目的情况下,运行器或 Visual Studio 本身可能会更改目录。我不知道它们是什么,但我知道 NUnit 不会这样做。
明显的解决方法是在测试中使用 TestContext.TestDirectory
。它由 NUnit 为此目的提供。请注意,它 仅 在测试代码中有效。如果您在测试代码之外需要类似的东西,您可以从 TestContext.TestDirectory
复制逻辑,它已经经过很好的测试。