如何在angular2中实现间隔/轮询以使用量角器?

时间:2016-04-01 14:05:06

标签: javascript selenium angular protractor rxjs

我有一个angular2 app我想用量角器测试。

在这个应用程序中,我有一个页面,其中包含一个图表,该图表定期使用自动生成的数据进行更新。

显然,量角器的一个功能是在执行测试代码之前等待脚本和http调用完成。但是,如果有一个永远不会完成的轮询脚本,量角器会在一段时间后永远等待并超时。

在angular1中,这可以通过使用$interval实现轮询来解决,量角器不会等待。不幸的是,在angular2中没有$interval,并且实现轮询的正确方法似乎是Observable.interval,所以这就是我的代码:

Observable.interval(500)
          .map(x => this.getRandomData())
          .subscribe(data => this.updateGraph(data));

在测试运行此代码的页面时,量角器将超时。它等待页面完成加载并认为这个脚本会在某个时候退出(实际上它会永远运行)。

  • 在角度2中是否存在量角器识别的间隔机制,以便它在运行UI测试之前不等待轮询完成?

  • 如果没有,我怎么能告诉量角器在执行更多测试代码之前不要等待这段时间?

编辑:为了澄清,有角度1的量角器中已存在超时问题,但可以使用$interval修复,请参阅:

这在angular2中不起作用,因为没有$interval

2 个答案:

答案 0 :(得分:4)

经过一番调查,我找到了两种可能的解决方案:

  1. browser.ignoreSynchronization = true指示量角器停止等待http调用和间隔脚本。但是,这可能会使编写e2e测试变得更加困难,因为现在您必须在测试之前手动等待元素和页面加载。
  2. protractor-xhr-only plugin基本上与ignoreSynchronization完全相同,但仅适用于区间脚本。量角器仍将等待$http次呼叫完成。
  3. 两者都不是一个完美的解决方案,但总比没有好。

答案 1 :(得分:1)

https://github.com/angular/protractor/issues/3349#issuecomment-232253059

在juliemr的帮助下解决了这个问题:

this.ngZone.runOutsideAngular(() => {
  this.timer = Observable.interval(1000)
}

超出区域运行超时,然后量角器将不会等待它。