XUnit 使用 Cake 与 .NET Core 一起工作
XUnit working with .NET Core using Cake
我有一个相对简单的解决方案。在 MSBuild 下一切正常(在 VS 2017 Mac 中)。我正在创建一个 Cake 构建脚本,但我无法让单元测试正常工作。有很多例子,但似乎 none 仍然有效。一些调用 DotnetCoreTest,大多数调用 XUnit2。在我的项目中根本不起作用。
当 运行 XUnit2 出现以下错误:System.InvalidOperationException: Unknown test framework: could not find xunit.dll (v1) or xunit.execution.*.dll (v2) in /Users/dev/Projects/MyProject/tst/MyProject.Serialization.UnitTests/bin/Release/netcoreapp1.1
而且那个输出是绝对有效的,文件实际上不存在。以下是我的单元测试项目的参考资料:
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0" />
<PackageReference Include="xunit" Version="2.2.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
<PackageReference Include="xunit.runner.console" Version="2.2.0" />
<PackageReference Include="FluentAssertions" Version="4.19.2" />
<PackageReference Include="Moq" Version="4.7.99" />
<PackageReference Include="FluentAssertions.AspNetCore.Mvc" Version="0.7.0-beta1" />
<PackageReference Include="AutoMapper" Version="6.1.1" />
<PackageReference Include="ExpectedObjects" Version="1.3.0" />
<PackageReference Include="OpenCover" Version="4.6.519" />
<PackageReference Include="xunit.extensibility.execution" Version="2.2.0" />
</ItemGroup>
我已经引用了 xunit.runner.console
和 xunit.extensibility.execution
,但它们并未复制到目标目录。 .NET Core 似乎没有任何方法可以强制执行此操作,即使我手动复制它们,测试程序集仍然不会加载。
这是我的蛋糕测试脚本:
#tool nuget:?package=NUnit.ConsoleRunner&version=3.4.0
#tool nuget:?package=xunit.runner.console
...
Task("Test")
.IsDependentOn("Build")
.Does(() =>
{
Information("Start Running Tests");
XUnit2(string.Format("./tst/**/*Tests/bin/{0}/**/*Tests.dll", configuration), new XUnit2Settings
{
});
});
很明显,我遗漏了一些非常基本的东西,但由于存在所有相互矛盾的信息,我不知道它是什么。我不应该使用 XUnit 吗?
我遇到了同样的问题,请使用 DotNetCoreTest 而不是 XUnit2 来解决。
Task("Test")
.Does(() =>
{
DotNetCoreTest("./test/[TestProjectPath]/[TestProject.csproj]");
});
我偶然发现了一个类似的问题,并找到了以下最新的 xUnit v2.4.0
解决方案,并希望与未来的旅行者分享。有了这个,测试在 Visual Studio 中被发现,并且可以通过命令行使用 CAKE 构建文件执行。
堆栈
- Visual Studio 2017 社区版 (
v15.8.4
)
- .NET 核心 2.1
- 蛋糕制作
- Windows 10
测试项目
该项目名为 MyProject.Tests
,位于解决方案文件夹的 \test\MyProject.Tests
文件夹中。 MyProject.Tests.csproj
项目文件包括包 xunit
和 xunit.runner.visualstudio
当前版本 v2.4.0
。后者是发现测试所必需的。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="xunit" Version="2.4.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.0" />
</ItemGroup>
</Project>
蛋糕
build.cake
有如下代码。 Task("Test")
获取 \test
文件夹中以 .Tests
结尾的所有项目并执行它们。
#tool nuget:?package=xunit.runner.console
// Configuration argument that can be passed via command line
// Default is "Release"
var configuration = Argument("configuration", "Release");
// ... omitted for brevity
// Run all test projects located in ./test folder
Task("Test")
.IsDependentOn("Build")
.Does(() =>
{
var projects = GetFiles("./test/**/*.Tests.csproj");
foreach(var project in projects)
{
DotNetCoreTest(
project.FullPath,
new DotNetCoreTestSettings()
{
// Set configuration as passed by command line
Configuration = configuration
});
}
});
我有一个相对简单的解决方案。在 MSBuild 下一切正常(在 VS 2017 Mac 中)。我正在创建一个 Cake 构建脚本,但我无法让单元测试正常工作。有很多例子,但似乎 none 仍然有效。一些调用 DotnetCoreTest,大多数调用 XUnit2。在我的项目中根本不起作用。
当 运行 XUnit2 出现以下错误:System.InvalidOperationException: Unknown test framework: could not find xunit.dll (v1) or xunit.execution.*.dll (v2) in /Users/dev/Projects/MyProject/tst/MyProject.Serialization.UnitTests/bin/Release/netcoreapp1.1
而且那个输出是绝对有效的,文件实际上不存在。以下是我的单元测试项目的参考资料:
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0" />
<PackageReference Include="xunit" Version="2.2.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
<PackageReference Include="xunit.runner.console" Version="2.2.0" />
<PackageReference Include="FluentAssertions" Version="4.19.2" />
<PackageReference Include="Moq" Version="4.7.99" />
<PackageReference Include="FluentAssertions.AspNetCore.Mvc" Version="0.7.0-beta1" />
<PackageReference Include="AutoMapper" Version="6.1.1" />
<PackageReference Include="ExpectedObjects" Version="1.3.0" />
<PackageReference Include="OpenCover" Version="4.6.519" />
<PackageReference Include="xunit.extensibility.execution" Version="2.2.0" />
</ItemGroup>
我已经引用了 xunit.runner.console
和 xunit.extensibility.execution
,但它们并未复制到目标目录。 .NET Core 似乎没有任何方法可以强制执行此操作,即使我手动复制它们,测试程序集仍然不会加载。
这是我的蛋糕测试脚本:
#tool nuget:?package=NUnit.ConsoleRunner&version=3.4.0
#tool nuget:?package=xunit.runner.console
...
Task("Test")
.IsDependentOn("Build")
.Does(() =>
{
Information("Start Running Tests");
XUnit2(string.Format("./tst/**/*Tests/bin/{0}/**/*Tests.dll", configuration), new XUnit2Settings
{
});
});
很明显,我遗漏了一些非常基本的东西,但由于存在所有相互矛盾的信息,我不知道它是什么。我不应该使用 XUnit 吗?
我遇到了同样的问题,请使用 DotNetCoreTest 而不是 XUnit2 来解决。
Task("Test")
.Does(() =>
{
DotNetCoreTest("./test/[TestProjectPath]/[TestProject.csproj]");
});
我偶然发现了一个类似的问题,并找到了以下最新的 xUnit v2.4.0
解决方案,并希望与未来的旅行者分享。有了这个,测试在 Visual Studio 中被发现,并且可以通过命令行使用 CAKE 构建文件执行。
堆栈
- Visual Studio 2017 社区版 (
v15.8.4
) - .NET 核心 2.1
- 蛋糕制作
- Windows 10
测试项目
该项目名为 MyProject.Tests
,位于解决方案文件夹的 \test\MyProject.Tests
文件夹中。 MyProject.Tests.csproj
项目文件包括包 xunit
和 xunit.runner.visualstudio
当前版本 v2.4.0
。后者是发现测试所必需的。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="xunit" Version="2.4.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.0" />
</ItemGroup>
</Project>
蛋糕
build.cake
有如下代码。 Task("Test")
获取 \test
文件夹中以 .Tests
结尾的所有项目并执行它们。
#tool nuget:?package=xunit.runner.console
// Configuration argument that can be passed via command line
// Default is "Release"
var configuration = Argument("configuration", "Release");
// ... omitted for brevity
// Run all test projects located in ./test folder
Task("Test")
.IsDependentOn("Build")
.Does(() =>
{
var projects = GetFiles("./test/**/*.Tests.csproj");
foreach(var project in projects)
{
DotNetCoreTest(
project.FullPath,
new DotNetCoreTestSettings()
{
// Set configuration as passed by command line
Configuration = configuration
});
}
});