无法使用 .NET Core 运行 xUnit 测试

Posted

技术标签:

【中文标题】无法使用 .NET Core 运行 xUnit 测试【英文标题】:Can't get xUnit tests to run with .NET Core 【发布时间】:2017-08-13 19:31:31 【问题描述】:

我正在将 NuGet 上的一个小型库移植到 .NET Core。

我为主项目和测试创建了 .NET Standard 1.6 类库,并复制了代码。我将单元测试更改为使用 xUnit 属性和断言,而不是 NUnit。

除此之外,我几乎按照the documentation 中的说明进行操作,因此我添加了以下 NuGet 包:

Microsoft.NET.Test.Sdk xunit xunit.runner.visualstudio

唉,(1) 测试资源管理器找不到我的单元测试,(2) 当我运行 dotnet test 时,我得到以下信息:

开始测试执行,请稍候... 找不到源“[...].Tests.dll”的 testhost.dll。确保测试项目具有包“microsoft.testplatform.testhost”的 nuget 引用。

我实际上已经添加了建议的Microsoft.TestPlatform.TestHost NuGet 包,但这并没有改变任何东西。

那么这里的问题是什么?

我使用的是 Visual Studio 2017。并不是说我认为它有什么不同。

更新:将测试项目从 Class Library (.NET Standard) 更改为 Class Library (.NET Core) 修复了问题。我仍然不明白为什么这会有所作为。

【问题讨论】:

【参考方案1】:

将测试项目从类库 (.NET Standard) 更改为类库 (.NET Core) 解决了该问题。我仍然不明白为什么这会有所作为。

单元测试是我们运行的应用程序。要构建这样的应用程序,我们必须指定运行时和应用程序模型。当我们以 .NET Standard 为目标时,运行时和应用程序模型是模棱两可的; MSBuild 不知道是针对 .NET Framework、.NET Core、Mono/Xamarin 还是其他符合 .NET Standard 的平台进行构建。以 .NET Core 为目标为 MSBuild 提供了所需的输入,它现在知道如何解析所有引用的程序集/项目并选择适当的框架版本。

但事实并非如此。过去,您总是使用类库进行单元测试;它从未被认为是您可以运行的应用程序,而是您将提供给测试运行器的类和方法的集合。

过去我们没有 .NET Standard,这是一个模棱两可的目标。当 MSBuild 看到 .NET Standard 时,它需要更多信息。 “好的,您想使用哪个符合 .NET Standard 的运行时来生成可运行的输出?”例如,如果我们以 netstandard1.2 为目标,那么 MSBuild 将不知道是针对 .NET Core 1.0、.NET Framework 4.5.1、Windows 8.1 还是其他几个符合 netstandard1.2 的平台进行构建。

开始测试执行,请稍候...找不到源'[...].Tests.dll'的testhost.dll。确保测试项目具有包“microsoft.testplatform.testhost”的 nuget 引用。

如果我们不指定 netcoreapp,则 MSBuild 假定我们使用的是完整框架。在这种情况下,它期望目标程序集(包括testhost.dll)位于bin 中。如果不是(如果我们针对 .NET Standard 构建,它们也不会),那么我们将收到上述错误。

【讨论】:

但事实并非如此。过去,您总是使用类库进行单元测试;它从未被认为是您可以运行的应用程序,而是您将提供给测试运行器的类和方法的集合。 好问题。我会调查的。我假设测试需要应用程序模型,但也可能是测试需要 .NET Standard(例如 .NET Core)的实现,而不仅仅是 .NET Standard 提供的一组接口。 在后台,Microsoft.NET.Test.Sdk 将在为 .net 核心构建时将项目从类库转变为控制台应用程序,以便生成“运行”所需的所有资产。 阅读答案我仍然不知道如何使 xUnit 测试与 NET Standard 一起工作。你能指出如何吗?有很多选择。我们应该以 .NET Core 为目标吗?我们应该以 .NET Core 应用程序为目标吗?哪个版本? ...向我们展示一个示例 csproj (XML) 怎么样? @SuperJMN 以实现 .NET Standard 的框架为目标。这可以是netcoreappnetuapwinwpawp 之一。【参考方案2】:

我的问题是一样的,在 Output > Test 控制台中有消息:

Microsoft.VisualStudio.TestPlatform.ObjectModel.TestPlatformException:
Unable to find [test-dir]\bin\Debug\netcoreapp3.1\testhost.dll.
Please publish your test project and retry.

我有基于包的xUnit 测试:

xunit (2.4.1) xunit.runner.visualstudio (2.4.2)

对我有什么帮助:

删除包:Microsoft.NET.Test.Sdk 安装包:Microsoft.TestPlatform.TestHost

现在可以工作并且更快

VS.NET 中所有基于 xUnit 的测试项目包:

在 NuGet 包管理器中:

【讨论】:

有趣; xunit.runner.visualstudio 2.4.1 通过对 Microsoft.NET.Test.Sdk 包的引用引用了 Microsoft.TestPlatform.TestHost。在将xunit.runner.visualstudio 升级到 2.4.3 后,我必须重新添加这两个包才能运行测试。不幸的是,这些更改并没有解决 testhost.xml 错误。

以上是关于无法使用 .NET Core 运行 xUnit 测试的主要内容,如果未能解决你的问题,请参考以下文章

Net Core:在Xunit Test中对AppService、Repository等执行所有依赖注入

xUnit 无法输出到控制台 .NET

json 适用于.NET Core的xUnit测试项目

.Net Core 5 Web Api - Xunit 没有读取我的 appsettings.Development

GitHub的dotnet core CI实践(.net core + xUnit + OpenCover + Appveyor + Coveralls.net)

如何在 xUnit 测试项目(.NET Core)中完成集成测试后关闭 Resharper 测试运行器?