错误从NUnit 2升级到NUnit 3时,"异步测试方法必须具有非void返回类型"

Jak*_*net 8 c# async-await nunit-3.0

我必须重构从NUNIT 2到NUNIT 3的单元测试,并且以下语法抛出错误:

var expectedResponseMessage = new HttpResponseMessage();
Func<Task<HttpResponseMessage>> continuation = 
   () => Task.Factory.StartNew(() => expectedResponseMessage);
Run Code Online (Sandbox Code Playgroud)

错误:

异步测试方法必须具有非void返回类型

我怎么能改写这个?我尝试了很多语法,但没有运气.谢谢.

Stu*_*tLC 14

错误

异步测试方法必须具有非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);
     ...
}
Run Code Online (Sandbox Code Playgroud)

在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.
}
Run Code Online (Sandbox Code Playgroud)

这是相当危险的 - 测试无法等待*,并且会在任何延续完成之前返回 - 例如Asserts,可能不会报告延续中完成的任何失败.

回复:你的假任务

调度任务只是为了返回一个虚假的响应似乎有点过分,即在大多数测试中你应该能够Task.FromResult用来替换:

Func<Task<HttpResponseMessage>> continuation = 
   () => Task.Factory.StartNew(() => expectedResponseMessage);
Run Code Online (Sandbox Code Playgroud)

随便便宜:

Func<Task<HttpResponseMessage>> continuation = 
   () => Task.FromResult(expectedResponseMessage);
Run Code Online (Sandbox Code Playgroud)

Task.FromResult 返回已经完成的具有给定返回值的任务 - 在大多数情况下,这应该足以满足您的单元测试目的,除非您确实希望在线程池上执行独立的任务.


*实际上,看起来甚至像NUnit 2.6.4这样的早期版本已经确定了async void测试问题,并采用了一种解决方法