我知道让一个方法返回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
}
答案 0 :(得分:3)
引用Async/Await - Best Practices in Asynchronous Programming作者Stephen Cleary
Void-returns async方法有一个特定的目的:make 异步事件处理程序可能。可以举办活动 返回一些实际类型的处理程序,但它不能很好地工作 语言;调用返回类型的事件处理程序非常 尴尬,以及事件处理程序实际返回的概念 一些事情没有多大意义。事件处理程序自然返回 void,所以异步方法返回void,这样你就可以拥有一个 异步事件处理程序但是,异步void的一些语义 方法与异步任务或语义的语义略有不同 异步任务方法。
Async void方法具有不同的错误处理语义。当一个 异常被抛出异步任务或异步任务方法,即 捕获异常并将其放在Task对象上。用async void 方法,没有Task对象,所以抛出任何异常 异步void方法将直接引发 在async void方法时处于活动状态的SynchronizationContext 启动。
最后几句话总结得很好。
长话短说,使用async Task
进行异步测试方法。
[Test()]
public async Task MyTest()
{
//Some code to run test
//Assert Something
}
你应该花一些时间阅读链接的文章。它的作者在该主题上有更多的资源,它将帮助您理解async / await背后的语义