我将NuGet上的一个小型库移植到.NET Core。
我为主项目和测试创建了.NET Standard 1.6类库,并复制了代码。我更改了单元测试以使用XUnit属性和断言而不是NUnit。
除此之外,我几乎遵循the documentation中的说明,因此我添加了以下NuGet包:
唉,(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)
解决了问题。我仍然不明白为什么这应该有所作为。
答案 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
兼容平台进行构建。
开始测试执行,请稍候...找不到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
测试:
什么对我有帮助:
Microsoft.NET.Test.Sdk
Microsoft.TestPlatform.TestHost
现在可以运行,并且更快!
VS.NET中所有基于xUnit的测试项目包:
在NuGet程序包管理器中: