为什么不能“asynchronous无效”unit testing被识别?

async voidunit testing不能在Visual Studio 2012中运行:

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

如果我想要有一个asynchronousunit testing,testing方法必须返回一个任务:

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

为什么这样? 不是我绝对需要有一个async voidtesting方法,我只是好奇。 即使无法运行,构buildasync voidtesting方法时,Visual Studio 2012也不会提示或错误…

async void方法应该被认为是“火与忘” – 没有办法等待他们完成。 如果Visual Studio要启动其中一个testing,它将无法等待testing完成(将其标记为成功),或者捕获引发的任何exception。

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

看到这个答案更多关于async void vs async Task讨论。

这只是因为MSTest不支持async voidunit testing。 通过引入可执行的上下文来实现这一点是可能的

MSTest不支持这一点,可能是因为微软认为对现有testing的改动太大了(如果现有的testing被给出了意想不到的上下文,现有的testing可能会死锁)。

没有编译器警告/错误,因为它是完全有效的C#代码。 它不起作用的唯一原因是由于unit testing框架(即,我相信xUnit支持async voidtesting),这将严重违反C#编译器关注的问题,以查看您的属性,确定你正在使用MSTest,并决定你真的不想使用async void

我在VS2015中发现任何用async装饰的Test方法都不会在Test Explorer中显示。 我最终删除了async关键字,并用task.Wait()replace了testing中的await调用,并在task.Result上完成了我的声明。

似乎工作正常。 还没有尝试过exceptiontesting呢。

 var task = TheMethodIWantToTestAsync(someValue); task.Wait(); var response = task.Result; Assert.IsNotNull(response); Assert.IsTrue(response.somevalue);