2012-03-13 42 views
1

我有一个问题,在单元测试期间,StoreAsync()方法返回。当不经调试运行时,即使它是异步方法,它似乎也不会返回。阻塞时运行正常,但不是在单元测试(StoreAsync)

什么给?

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

有一点不清楚:你的问题是单元测试不应该失败,当它应该或......? – jv42 2012-03-14 17:03:02

+0

基本上我在说..为什么它没有在单元测试中失败,但在正常运行时失败。 – 2012-03-14 17:04:39

回答

0

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

如果您使用VS 11 Dev Preview,然后使用CodePlex中的Async Unit Tests project

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

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

VS 11 Beta增加了对async Task单元测试方法的一流支持。所以上面的第二步是不同的:MSTest看到测试方法返回,但知道不认为它完成,直到Task完成。

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

+0

您好Stephen,感谢您的回复,这里的问题是,当作为单元测试运行时,StoreAsync操作返回并能够从流中分离;当正常运行时,它不会。在接收端实际上是您的PacketProtocol处理TCP消息=) – 2012-03-13 16:16:42

+0

我明白了。我只看到过这样的两次死锁:一个是[由于ASP.NET MVC 4 Beta中的错误](http://stackoverflow.com/questions/9627329/using-an-async-action-to-run-同步代码/ 9635844#9635844),另一个是[当异步方法尝试同步回执行阻塞等待返回的任务的线程](http://social.msdn.microsoft.com/Forums/EN-US /异步/线程/ 269172a3-adb9-4b5e-9ac1-8b67ff920177)。这些*看起来都不是这种情况,但是你可以尝试改变'await writer.StoreAsync()'到'await writer.StoreAsync()。ConfigureAwait(false)'? – 2012-03-17 01:10:13

相关问题