Dot-Net-Core

無法使用 .NET Core 執行 xUnit 測試

  • July 21, 2020

我正在將 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 建構,它們也不會),那麼我們將收到上述錯誤。

引用自:https://stackoverflow.com/questions/42938879