在正常运行时阻塞,但在单元测试期间不阻塞(StoreAsync)

本文关键字:StoreAsync 运行时 单元测试 | 更新日期: 2023-09-27 18:27:34

我在这里遇到了一个问题,在单元测试期间,StoreAsync()方法返回。当在没有调试的情况下运行时,它似乎永远不会返回,即使它是一个异步方法。

什么东西?

   DataWriter writer = new DataWriter(_client.OutputStream);
   writer.WriteBytes(payload);
   await writer.StoreAsync(); // <--- returns only during unit test
   writer.DetachStream();

在正常运行时阻塞,但在单元测试期间不阻塞(StoreAsync)

如果您使用的是VS 11 Beta,请确保您的单元测试声明为async Task

如果您使用的是VS11开发人员预览版,那么请使用CodePlex中的异步单元测试项目。

我在博客上有更多关于异步单元测试的信息(第1部分,第2部分)。总结:

  1. await需要(异步)等待时,它会调度一个延续并返回给它的调用者
  2. MSTest看到测试方法返回,没有看到任何异常,并将其标记为"已通过"
  3. 稍后,StoreAsync将完成,方法的其余部分将运行(在线程池线程上,而不是在该单元测试的上下文中)

VS11Beta增加了对async Task单元测试方法的一流支持。因此,上面的第二步不同:MSTest看到测试方法返回,但知道在Task完成之前不要认为它是完整的。

异步单元测试项目采用不同的方法:它为[AsyncTestClass]中的每个单元测试方法应用异步上下文。这个异步上下文在完成单元测试之前等待所有异步操作完成(包括async void方法)。