不能使用.NET Core运行xUnit测试

19
我正在将我在NuGet上拥有的一个小型库移植到.NET Core。
我为主项目和测试创建了.NET Standard 1.6类库,并复制了代码。我将单元测试更改为使用xUnit属性和断言而不是NUnit。
除此之外,我基本上遵循了文档中的说明,因此我添加了以下NuGet包:
  • Microsoft.NET.Test.Sdk
  • xunit
  • xunit.runner.visualstudio

哎呀,(1)测试资源管理器无法找到我的单元测试,而且(2)当我运行dotnet test时,出现以下情况:

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

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

那么问题在哪里呢?

我正在使用Visual Studio 2017。虽然我不认为这会有什么区别。

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

2个回答

15
将测试项目从类库(.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的平台。

enter image description here

开始测试执行,请稍等... 找不到源 '[...].Tests.dll' 的 testhost.dll。请确保测试项目引用了“microsoft.testplatform.testhost”NuGet包。如果我们没有指定netcoreapp,则MSBuild会假定我们正在使用完整的框架。在这种情况下,它期望目标程序集(包括testhost.dll)在bin中。如果它们不存在(如果我们构建针对.NET Standard),那么我们将收到上述错误。

1
但这从来不是事实。过去,你总是使用类库进行单元测试;它从来没有被视为一个可以运行的应用程序,而是一组类和方法,你会将其输入到测试运行器中。 - Gigi
好问题。我会研究一下。我假设测试需要应用程序模型,但也可能是测试需要 .NET Standard 的实现(如 .NET Core),而不仅仅是 .NET Standard 提供的接口集。 - Shaun Luttin
在幕后,Microsoft.NET.Test.Sdk 在构建 .net core 时将项目从类库转换为控制台应用程序,以生成所有需要“运行”的资产。 - Martin Ullrich
8
阅读答案后,我仍然不知道如何在NET Standard中使用xUnit测试。您能否指示如何操作?有很多选择。我们应该针对.NET Core吗?我们应该针对.NET Core应用程序吗?哪个版本?...可以给我们展示一个示例csproj(XML)吗? - SuperJMN
1
@SuperJMN 目标是针对实现 .NET Standard 的框架进行开发。可以选择 netcoreappnetuapwinwpawp 中的任意一个。 - Shaun Luttin
好的解释。 - James John McGuire 'Jahmic'

4

我遇到了相同的问题,在输出 > 测试 控制台中显示以下消息:

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

现在可以工作,而且速度更快

在Visual Studio中所有基于xUnit的测试项目包:

所有在VS.NET中基于xUnit的项目包

NuGet包管理器中的内容:

NuGet包管理器中的Microsoft.TestPlatform.TestHost


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接