单元测试返回异步无效是不是很糟糕?

时间:2017-06-29 20:42:51

标签: c# unit-testing asynchronous

我知道让一个方法返回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
}

1 个答案:

答案 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背后的语义