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

问题描述 投票:0回答:1

我必须将单元测试从 NUNIT 2 重构为 NUNIT 3,以下语法会引发错误:

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

错误:

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

我该如何重写这个?我尝试了很多语法但没有成功。

c# async-await nunit-3.0
1个回答
40
投票

错误

异步测试方法必须具有非 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.
}

这是相当危险的 - 测试不会返回

Task
,跑步者可以等待*,并且可能在任何延续完成之前返回 - 例如后续中完成的
Asserts
中的任何失败可能不会被报告。

回复:你的假任务

仅仅为了返回虚假响应而安排任务似乎有点过分了,即在大多数测试中,您应该能够使用

Task.FromResult
来替换:

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

更便宜的:

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

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


* 实际上,似乎更早的版本(例如 NUnit 2.6.4)已经通过

async void
测试发现了该问题,并且 合并了解决方法

© www.soinside.com 2019 - 2024. All rights reserved.