[英]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.