noa*_*oah 3 c# unit-testing asynchronous
我知道让方法返回 async void 是不好的做法,因为它很难测试,但是单元测试是否有任何理由需要返回 async Task 而不是 async void?
基本上是这样的:
[Test()]
public async void MyTest()
{
//Some code to run test
//Assert Something
}
Run Code Online (Sandbox Code Playgroud)
或者我应该这样做:
[Test()]
public async Task MyTest()
{
//Some code to run test
//Assert Something
}
Run Code Online (Sandbox Code Playgroud)
引用Async/Await - Stephen Cleary 的异步编程最佳实践
返回空值的异步方法有一个特定的目的:使异步事件处理程序成为可能。可能有一个事件处理程序返回一些实际类型,但这在语言中不能很好地工作;调用返回类型的事件处理程序非常笨拙,并且事件处理程序实际上返回某些内容的概念没有多大意义。事件处理程序自然返回 void,因此异步方法返回 void,以便您可以拥有异步事件处理程序。但是,async void 方法的某些语义与 async Task 或 async Task 方法的语义略有不同。
异步 void 方法具有不同的错误处理语义。当异步任务或异步任务方法抛出异常时,该异常将被捕获并放置在任务对象上。对于 async void 方法,没有 Task 对象,因此从 async void 方法抛出的任何异常都将直接在异步 void 方法启动时处于活动状态的 SynchronizationContext 上引发。
最后几句话总结的很好。
长话短说,async Task用于异步测试方法。
[Test()]
public async Task MyTest()
{
//Some code to run test
//Assert Something
}
Run Code Online (Sandbox Code Playgroud)
您真的应该花一些时间阅读链接的文章。它的作者在该主题方面拥有更多资源,它将帮助您理解 async/await 背后的语义