【发布时间】:2015-01-14 09:22:36
【问题描述】:
我有一个 Angular Web 应用程序,它通过长轮询持续监听来自后端的通知:
scope.notification = $resource('/notification').get();
此请求在测试环境中永远不会完成。这对 Protractor 来说是个问题,因为它想等待所有未完成的 HTTP 请求完成。
我看到了许多潜在的解决方案,但都存在一些问题。
我没有办法告诉 Protractor 忽略此请求。从$interval(本身被忽略)发出它不是解决方案。 Protractor 不会等待请求发送,但是一旦发送,它仍然会等待它完成。
所以我尝试在运行测试时不发送此请求。但是我怎么知道我在考试呢?
- 我可以在 URL (
?protractor=true) 中添加一个标志。但是我的网络应用一直在修改 URL,所以很快就会被清除。 - 我尝试设置一个变量:
browser.executeScript('window.runningProtractorTests = true;');但似乎 Protractor 会先等待页面同步,然后再运行executeScript。我会在页面加载后立即发送请求。 - 我可以设置一个 cookie。但它相当麻烦,例如我必须加载页面两次。 (更多困难请参见issue 341。)
- 我可以设置一个用户代理。这也不容易。我需要在配置文件中为每个浏览器设置浏览器标志。我不想完全覆盖用户代理(例如,
Protractor),因为我担心我的库可能依赖于解释用户代理字符串,所以我必须找出正确的字符串。 - 我可以检查服务器是否在特定端口上运行。但一年后,有人会尝试在同一端口上运行生产服务器,但不明白为什么通知不起作用。
- 让测试后端立即完成请求并没有帮助,因为只要完成,它就会立即再次发送。但我想我可以引入一个特殊的“你正在测试” 通知,并在收到此通知时停止轮询。这将意味着对我们的协议进行(小)更改,因此如果可能,我宁愿避免这样做。
有没有直接的方法可以做到这一点?
【问题讨论】:
标签: angularjs protractor