为什么不能识别"异步无效"单元测试?

Max*_*Max 75 c# unit-testing async-await c#-5.0 visual-studio-2012

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

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

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

[TestMethod]
public async Task VisibleMyTestMethod()
{
    await Task.Delay(1000);
    Assert.IsTrue(true);
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样?不是说我绝对需要async void测试方法,我只是好奇.构建async void测试方法时,Visual Studio 2012不会发出警告或错误,即使它无法运行...

Ric*_*ard 78

async void方法应该被视为"火与忘" - 没有办法等待它们完成.如果Visual Studio要启动其中一个测试,它将无法等待测试完成(将其标记为成功)或捕获引发的任何异常.

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

有关vs的更多讨论,请参阅此答案.async voidasync Task

  • 这不是真的.NUnit支持`async void`测试,支持它的方式和原因在某种程度上详细说明[link](http://simoneb.github.io/blog/2013/01/19/async-support-in- NUnit的/).请参阅下面的[answer](http://stackoverflow.com/a/19319749/285199). (3认同)

Ste*_*ary 21

这只是因为MSTest不支持async void单元测试.这是可能的引入,使他们能够执行环境这样做.

MSTest不支持这一点,可能是因为微软认为对现有测试的改变太多了(如果给出意外情况,现有测试可能会死锁).

没有编译器警告/错误,因为它是完全有效的C#代码.它不起作用的唯一原因是因为单元测试框架(即,我相信xUnit确实支持async void测试),并且它将严重违反C#编译器的关注点,以查看您的属性,确定您正在使用MSTest,并决定你真的不想使用async void.


Nic*_*ght 19

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

似乎工作正常.尚未尝试过异常测试.

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

Assert.IsNotNull(response);
Assert.IsTrue(response.somevalue);
Run Code Online (Sandbox Code Playgroud)

  • 不要认为它需要调用task.Wait()作为调用task.Result将自动调用task.Wait()如果任务尚未完成. (3认同)
  • 这是正确的,你不需要调用Wait(). (2认同)