【问题标题】:Handling Async With Specflow for Silverlight使用 Specflow 处理 Silverlight 的异步
【发布时间】:2010-08-02 03:47:41
【问题描述】:

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

  • 是否可以使用这些工具来等待测试中行为异步的 Silverlight 方法调用(例如进行 Web 服务调用)?
  • 如果不能,在 SpecFlow 测试文件中处理此行为的指导是什么? (也许使用在事件处理程序中触发的 AutoResetEvent 并等待它?)

【问题讨论】:

    标签: .net silverlight tdd bdd specflow


    【解决方案1】:

    使用 AutoResetEvent 将不起作用,因为 WaitOne 调用会阻塞 UI 线程。即使在对数据服务进行异步调用时,Silverlight 也会使用 UI 线程(参见这篇文章 - Thead is blocked using WebClient and ManualResetEvent),因此 WaitOne 实际上会停止调用该服务。

    【讨论】:

      【解决方案2】:

      我知道这可能为时已晚,但这里是。

      对于 silverlight 异步调用,您可以使用 Specflow AsyncContext api

      https://github.com/techtalk/SpecFlow/wiki/Testing-Silverlight-Asynchronous-Code

      我在这里开发的时候在博客上写过这个

      http://rburnham.wordpress.com/2011/05/13/testing-silverlight-asynchronous-code-with-specflow/

      这有助于解释这个概念。

      【讨论】:

        【解决方案3】:

        我猜每个看过并支持这个问题的人都在等待有人给出一个很棒、优雅的答案,但看起来这不会在这里发生。为了帮助现在需要可用答案的其他人...

        我对其他单元测试情况所做的是使用问题中提到的 AutoResetEvent:

        AutoResetEvent MyAutoReset = new AutoResetEvent();
        [TestMethod]
        public void MyTestMethod()
        {
           var MyItem.GetItem(x => 
              {
                 // Return handler
                 MyAutoReset.Set();
              });
           MyAutoReset.WaitOne(5000, false));
        }
        

        显然,使用这种方法需要考虑一些事项,但它可以传达想法。

        【讨论】:

        • 感谢杰森的更新。显然,自从最初发布此消息以来已经有一段时间了。当我有时间将此代码应用于源自 SpecFlow 的测试时,我很乐意将其标记为答案。另外,我想知道新的 Async CTP 是否会解决这个问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-11
        • 2010-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-27
        • 2014-09-28
        相关资源
        最近更新 更多