【发布时间】:2017-06-29 20:42:50
【问题描述】:
我知道让方法返回 async void 是不好的做法,因为它很难测试,但是单元测试是否有任何理由需要返回 async Task 而不是 async void?
基本上可以这样:
[Test()]
public async void MyTest()
{
//Some code to run test
//Assert Something
}
或者我应该这样做:
[Test()]
public async Task MyTest()
{
//Some code to run test
//Assert Something
}
【问题讨论】:
-
您想知道您的测试是否结束、测试何时结束以及您的测试是否成功完成?
-
大多数单元测试运行器支持
async void方法(通过使用自定义同步上下文)。尽管如此,使用async Task进行测试更清洁/更安全 -
@KevinGosse 在您的方法中,您仍然可以做很多事情来阻止测试框架正常工作,即使使用自定义同步上下文也是如此。 (例如,一些带有
ConfigureAwait(false);的代码就是破坏事物所需要的全部内容。) -
@Servy 实际上,同步上下文的
OperationCompleted事件只会在async void方法结束时触发,即使中间使用.ConfigureAwait(false)也是如此。我敢肯定有一些极端情况,但它比看起来更难破解。
标签: c# unit-testing asynchronous