如何使用来自 Rider 或 VS 2017 的 NUnit、xUnit 或 MSTest 测试 .NET Standard 2 库?

How to test .NET Standard 2 library with either NUnit, xUnit or MSTest from either Rider or VS 2017?

我有一个使用 Azure Durable Functions 的项目,它们仅在 .NET Standard 2 上可用。因此,它定义了可以在测试项目中使用哪个 class 库。但是,我无法将在 unit/integration 测试中使用 xUnit、NUnit 或 MSTest 的库放在一起。

将 NUnit 添加到 .NET Standard 2 为 class 库的项目失败并出现以下错误:

INFO: Restoring packages for C:\VSTS\github.com\netstandardXunitMsTestNunit\src\Netstandard2xUnitMsTestnUnit\nunit\nunit.csproj... DEBUG: Restoring packages for .NETStandard,Version=v2.0... DEBUG: Resolving conflicts for .NETStandard,Version=v2.0... ERROR: Cycle detected. nunit -> NUnit (>= 3.9.0). DEBUG: Checking compatibility of packages on .NETStandard,Version=v2.0. DEBUG: Checking compatibility for nunit 1.0.0 with .NETStandard,Version=v2.0.

xUnit 的错误是相同的(只是错误消息谈论的是 xUnit 循环)。

这两个错误也可以在 Rider 和 Visual Studio 2017 Enterprise 中重现。清理 nuget 缓存后,我再次尝试。结果是一样的

在 MsTest 的情况下,可以添加 ms 测试库,但测试发现既不工作 Rider 也不工作 Visual Studio。

是否可以对 .NET Standard 2 库进行单元测试?

除了等待这些项目采用 .NET Standard 2 之外,我还能做些什么吗?

I created a small sample project, can be found here: https://github.com/SayusiAndo/netstandard2xunitresharper

.NET Standard 没有运行时,因此它不会执行您的测试。

您的测试程序集必须针对可执行 平台,例如 .NET Framework 或 .NET Core 版本。

<TargetFramework>net470</TargetFramework>

或者

<TargetFramework>netcoreapp2.0</TargetFramework>

有关详细信息,请参阅

.NET Standard 是每个 .NET Standard 版本(例如 .NET Framework、.NET Core 和 Xamarin)定义的一组 API,所有 .NET 实现必须提供这些 API 以符合该版本。您的库的 TargetFramework 值为 netstandard2.0,这意味着您不仅可以从 .NET Core 应用程序引用逻辑库,还可以从为 .NET Framework 或 Xamarin 构建的应用程序引用逻辑库。

但是,您不能为其构建应用程序,只能构建库。这是 MSDN doc about .NET Standard.

因此,如果您想测试该库,您需要指定您的库支持的目标。如果你想支持多个 .NET 版本,那么你应该测试它们以确保你的库可以 运行 在这些目标上正确。这是.csproj中目标框架的配置:

单一目标:

<TargetFramework>net461</TargetFramework>

多个目标:

<TargetFrameworks>netcoreapp2.0;net461</TargetFrameworks>
  1. 如果您的 class 库将由以 .Net Framework 4.6.1 为目标的应用程序使用,则在以 .Net Framework 4.6.1 为目标的同一解决方案中创建一个新的单元测试项目,以便您进行测试使用相同的框架组合。
  2. 在单元测试项目的引用下添加对class库项目的引用。
  3. 将 xUnit 和 xUnit.runner.visualstudio nuget 包添加到单元测试项目。
  4. 将单元测试 class 重命名为相关名称,并将 using MSTest 指令替换为 using XUnit。
  5. 开始编写和 运行 测试。(build/re-build 解决方案因此它会为每个新测试更新测试资源管理器中的测试列表)。

我最近发布了我的私有单元测试平台,它 .NETStandard 2.0 很好。除非您在测试中投入了大量时间和精力,否则您可能想看看 Nuclear.Test.

基本上,如果您将测试项目定位在 .NETStandard,它将在 .NETFramework.NETCore 过程中执行这些测试,以查看它们是否都正常工作。

不幸的是,目前它需要 .NETStandard 2.0 作为最小版本。幸运的是,这就是您正在使用的。

此解决方案既不是 NUnit 也不是 xUnit 也不是 MSTest,但它会完全按照您的描述进行操作。