无法通过.NET Core

时间:2017-03-21 21:57:05

标签: .net-core xunit

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

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

除此之外,我几乎遵循the documentation中的说明,因此我添加了以下NuGet包:

  • Microsoft.NET.Test.Sdk
  • 的xUnit
  • xunit.runner.visualstudio

唉,(1)Test Explorer找不到我的单元测试,(2)当我运行dotnet test时,我得到以下内容:

  

开始测试执行,请稍候......   无法找到testhost.dll for source' [...]。Tests.dll'。确保测试项目有一个nuget参考包" microsoft.testplatform.testhost"。

我实际上添加了建议的Microsoft.TestPlatform.TestHost NuGet包,但是没有改变任何内容。

那么这里有什么问题?

我正在使用VS2017。并不是说我觉得它有所作为。

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

2 个答案:

答案 0 :(得分:8)

  

将测试项目从类库(.NET标准)更改为类库(.NET Core)修复了该问题。我仍然不明白为什么这应该有所作为。

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

  

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

过去我们没有.NET Standard,这是一个模棱两可的目标。当MSBuild看到.NET Standard时,它需要更多信息。 "好的,您希望使用哪个符合.NET标准的运行时来生成可运行的输出?"例如,如果我们定位netstandard1.2,那么MSBuild将无法知道是否针对.NET Core 1.0,.NET Framework 4.5.1,Windows 8.1或其他几个netstandard1.2兼容平台进行构建。

enter image description here

  

开始测试执行,请稍候...找不到testhost.dll for source' [...]。Tests.dll'。确保测试项目有一个nuget参考包" microsoft.testplatform.testhost"。

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

答案 1 :(得分:2)

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

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的测试项目包:

All xUnit base project packages in VS.NET

在NuGet程序包管理器中:

Package Microsoft.TestPlatform.TestHost in NuGet Package Manager