我必须将单元测试从 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.
}
这是相当危险的 - 测试不会返回
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
测试发现了该问题,并且 合并了解决方法