使用 Rx 和 Silverlight 编写异步测试

  • Jonathan Allen
  • 李永伦

2011 年 8 月 10 日

话题:.NET语言 & 开发

在 Silverlight 里做集成测试很难。几乎任何类型的外部服务都需要一个返回 UI 线程的异步调用。和大多数单元测试框架不同,Silverlight 使用的那个单元测试框架运行在相同线程上,因此你不能阻止它等待服务调用的返回。

更糟糕的是,事实上这个 Silverlight 测试框架(简称Silverlight Unit Testing Framework)非常容易出错。任何线程的未处理异常都会破坏整个测试的运行,而前面提到的集成测试却需要使用多线程。

一个解决方案是始终通过 EnqueueCallback 确保异常恰当地报告给单元测试框架。但是,这也不是那么好做的,只要一个错误就能中断接下来的所有测试。Richard Szalay 示范了如何使用 Reactive Extensions 强化异步测试,同时降低出错率。

Richard 使用的技术假设你通过传统的 Begin 和 End 两个方法使用异步模式。使用 Observable.FromAsyncPattern 函数把服务的调用封装到一个 IObservable 里。一旦完成,ObserveOnTest 函数就会通过一个叫做 WorkItemTestScheduler 的特殊计划程序把单元测试框架关联到调用链上。最后调用 Subscribe 函数启动序列并计算结果。

查看英文原文:Writing Asynchronous Tests with Rx and Silverlight

.NET语言 & 开发