为什么不能识别“async void”单元测试?

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

async void
单元测试无法在 Visual Studio 2012 中运行:

[TestClass]
public class MyTestClass
{
    [TestMethod]
    public async void InvisibleMyTestMethod()
    {
        await Task.Delay(1000);
        Assert.IsTrue(true);
    }
}

如果我想进行异步单元测试,测试方法必须返回一个任务:

[TestMethod]
public async Task VisibleMyTestMethod()
{
    await Task.Delay(1000);
    Assert.IsTrue(true);
}

为什么会这样?并不是说我绝对需要

async void
测试方法,我只是好奇。构建
async void
测试方法时,Visual Studio 2012 不会发出警告或错误,即使它无法运行...

c# unit-testing visual-studio-2012 async-await c#-5.0
4个回答
99
投票

async void
方法应被视为“即发即弃”——没有办法等待它们完成。如果 Visual Studio 要启动这些测试之一,它将无法等待测试完成(将其标记为成功)或捕获任何引发的异常。

使用

async Task
,调用者可以等待执行完成,并捕获运行时引发的任何异常。

这个答案有关

async void
async Task
的更多讨论。


24
投票

只是因为MSTest不支持

async void
单元测试。 可能通过引入他们可以执行的上下文来做到这一点。

MSTest 不支持这一点,可能是因为 Microsoft 认为它对现有测试的更改太大(如果给定意外上下文,现有测试可能会死锁)。

没有编译器警告/错误,因为它是完全有效的 C# 代码。它不起作用的唯一原因是单元测试框架(即,我相信 xUnit 确实支持

async void
测试),并且 C# 编译器查看您的属性将严重违反关注点分离,确定您正在使用 MSTest,并确定您真的不想使用
async void
.


24
投票

我发现在 VS2015 中,任何使用 async 修饰的测试方法都不会在测试资源管理器中显示。我最终删除了 async 关键字,并用 task.Wait() 替换了测试中的 await 调用,并在 task.Result 上完成了断言。

似乎工作正常。还没有尝试过异常测试。

var task = TheMethodIWantToTestAsync(someValue);
task.Wait();
var response = task.Result;

Assert.IsNotNull(response);
Assert.IsTrue(response.somevalue);

0
投票

只需将 Wait() 添加到您正在调用的函数中。 TheMethodIWantToTestAsync(someValue).Wait();

以上对我有用。

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