2011-05-04 65 views
0

为silverlight创建单元测试时,测试框架似乎内置了一些功能以帮助进行异步调用,但仅限于测试方法内。如果在你正在呼叫的那个子方法中有一个异步调用,该怎么办?Silverlight单元测试,处理嵌套方法中的异步调用

作为一个例子,我们使用Specflow来测试我们的ViewModels,我们要调用一个命令的Execute方法,然后该命令异步调用Web服务。在声明结果之前,如何确保while命令完成?

作为一个例子,这是命令

[Asynchronous] 
    [When(@"I press calculate")] 
    public void WhenIPressCalculate() 
    { 
     _helloWorldViewModel.CalculateCommand.Execute(null); 
    } 

我需要等待整个命令完成后再继续。

+0

如果异步调用与WCF服务相关,则可以创建一个模拟服务,该服务在方法调用中没有延迟。这是更好的方法,因为单元测试不需要很多时间来完成。 – vorrtex 2011-05-04 16:33:02

+0

我们实际上正在测试功能块(行为驱动开发),所以我们称之为真正的服务是很好的。这样我们可以确保该功能完整。 – Nitro52 2011-05-04 23:53:33

回答

0

用与执行完成的退出条件相同的方法创建循环。

0

当调用网络服务时,循环不起作用,因为回调被封送到UI线程,如果它正在循环处理一个条件,则会在回调等待线程完成时创建死锁。

无论如何,我们把这个问题解决了。事实证明specflow的人正在同时工作,并有一个解决方案正在进行中。我们在预发布版本中使用了它。

我写了一篇博客条目约在这里http://rburnham.wordpress.com/2011/05/13/testing-silverlight-asynchronous-code-with-specflow/

这可能会改变,因为这是用预发布版本做了,希望我去的时间,如果它来更新它。