簡體   English   中英

從 NUnit 2 升級到 NUnit 3 時出現錯誤“異步測試方法必須具有非空返回類型”

[英]Error `Async test method must have non-void return type` when upgrading from NUnit 2 to NUnit 3

我必須將單元測試從 NUNIT 2 重構為 NUNIT 3,以下語法會引發錯誤:

var expectedResponseMessage = new HttpResponseMessage();
Func<Task<HttpResponseMessage>> continuation = 
   () => Task.Factory.StartNew(() => expectedResponseMessage);

錯誤:

異步測試方法必須具有非 void 返回類型

我該如何重寫? 我嘗試了很多語法,但沒有運氣。

錯誤

異步測試方法必須具有非 void 返回類型

意味着在 NUnit 3+ 中, async單元測試本身可能沒有void返回類型(即用[Test] / [TestCase]等裝飾的方法)。 相反,您可以返回一個空Task在具有異步測試支持的較新版本的 NUnit 中的正確方法):

[Test]
public async Task EnsureFoo()
{
     // Arrange

     // Act
     var myResult = await classBeingTested.DoSomethingAsync();

     // Assert
     Assert.IsNotNull(myResult);
     ...
}

在 NUnit 2.x 中,這沒有被檢查,因此async void單元測試可能會滑入您的單元測試代碼庫,即形式(糟糕,不要這樣做

[Test]
public async void Foo() // < -- Error : Async test method must have non-void return type
{
     var myResult = await classBeingTested.DoSomethingAsync();
     // Post continuation assertions here.
}

這是相當危險的 - 測試不能等待* ,並且會在任何延續完成之前返回 - 例如,可能不會報告延續中完成的Asserts中的任何失敗。

Re: 你的假任務

安排一個任務只是為了返回一個假響應似乎Task.FromResult矯枉過正,即在大多數測試中你應該能夠使用Task.FromResult來替換:

Func<Task<HttpResponseMessage>> continuation = 
   () => Task.Factory.StartNew(() => expectedResponseMessage);

用更便宜的:

Func<Task<HttpResponseMessage>> continuation = 
   () => Task.FromResult(expectedResponseMessage);

Task.FromResult使用給定的返回值返回一個已經完成的任務 - 在大多數情況下,這應該足以滿足您的單元測試目的,除非您確實希望在Task.FromResult執行一個獨立的任務。


* 實際上,似乎更早的版本(例如 NUnit 2.6.4)已經發現async void測試的問題,並采用了解決方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM