無法使用 .NET Core 執行 xUnit 測試
我正在將 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。確保測試項目具有包“microsoft.testplatform.testhost”的 nuget 引用。
我實際上已經添加了建議的
Microsoft.TestPlatform.TestHostNuGet 包,但這並沒有改變任何東西。那麼這裡的問題是什麼?
我正在使用 Visual Studio 2017。並不是說我認為它會有所作為。
更新:將測試項目從更改
Class Library (.NET Standard)為Class Library (.NET Core)解決問題。我仍然不明白為什麼這應該有所作為。
將測試項目從類庫 (.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是 .NET,那麼 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 建構,它們也不會),那麼我們將收到上述錯誤。
