使用Specflow处理Silverlight异步操作

12

Silverlight单元测试框架定义了一个处理异步调用的过程(从Microsoft.Silverlight.Testing.SilverlightTest派生测试类,添加Asynchronous属性,使用EnqueueXXX方法)。考虑到SpecFlow在测试类和步骤之间提供的分离:

  • 这些工具可以被用来等待测试中异步执行的Silverlight方法调用吗?(例如进行Web服务调用)
  • 如果不能,那么在SpecFlow测试文件中如何处理这种行为?(也许可以使用AutoResetEvent,在事件处理程序中触发并等待它?)
3个回答

3
使用AutoResetEvent无法工作,因为WaitOne调用会阻塞UI线程。即使在向数据服务进行异步调用时,Silverlight也会利用UI线程(请参见此帖子 - WebClient和ManualResetEvent使用时线程被阻止),因此WaitOne实际上会阻止服务的调用。

2

1
我猜测每个看过并点赞了这个问题的人都在期待有人能提供一个棒而优雅的答案,但是看起来这里不会发生。为了帮助那些现在需要可用答案的其他人...
我在其他单元测试情况下所做的就是使用像你在问题中提到的AutoResetEvent:
AutoResetEvent MyAutoReset = new AutoResetEvent();
[TestMethod]
public void MyTestMethod()
{
   var MyItem.GetItem(x => 
      {
         // Return handler
         MyAutoReset.Set();
      });
   MyAutoReset.WaitOne(5000, false));
}

显然,这种方法需要考虑一些事情,但它能够传达出想法。


感谢更新,Jason。显然,这篇文章最初发布已经有一段时间了。当我有时间将此代码应用于SpecFlow衍生的测试时,我会很高兴将其标记为答案。另外,我想知道新的Async CTP是否会对这个问题产生影响。 - John Garland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接