量角器测试与长轮询

时间:2014-11-17 12:50:16

标签: angularjs protractor

我有一个Angular网络应用程序,通过长时间轮询持续监听来自后端的通知:

scope.notification = $resource('/notification').get();

此请求永远不会在测试环境中完成。对于Protractor来说这是一个问题,因为它希望等待所有未完成的HTTP请求完成。

我看到了许多潜在的解决方案,但是它们都存在一些问题。

我没有看到告诉Protractor忽略此请求的方法。从$interval发出它(它本身被忽略)不是解决方案。量角器不会等待发送请求,但一旦发送,它仍将等待它完成。

所以我试图在运行测试时不发送此请求。但我怎么知道我参加考试?

  • 我可以在网址上添加一个标记(?protractor=true)。但我的网络应用程序一直在修改URL,因此可以快速清除。
  • 我尝试设置一个变量:browser.executeScript('window.runningProtractorTests = true;');但似乎Protractor会在运行executeScript之前等待页面先同步。我在页面加载时立即发送请求。
  • 我可以设置一个cookie。但它相当麻烦,例如我必须加载页面两次。 (有关更多困难,请参阅issue 341。)
  • 我可以设置用户代理。这也不容易。我需要在配置文件中为每个浏览器设置浏览器标志。我不想完全覆盖用户代理(例如Protractor),因为担心我的库可能依赖于解释用户代理字符串,因此我必须弄清楚正确的字符串。
  • 我可以检查服务器是否在特定端口上运行。但是一年之后,有人会尝试在同一个端口上运行生产服务器而不理解为什么通知不起作用。
  • 让测试后端立即完成请求没有帮助,因为它会在完成后立即再次发送。但我想我可以引入一个特殊的"您正在进行测试" 通知并在收到此消息时停止轮询。这意味着对我们的协议进行(小)更改,因此,如果可能的话,我宁愿避免使用它。

有没有直接的方法来做到这一点?

2 个答案:

答案 0 :(得分:4)

您是否可以将$resource的来电置于使用量角器browser.addMockModule()嘲笑的服务中?这样,Protractor将在它有机会运行之前始终覆盖原始服务。

这看起来像

// in your application
myModule.service('myNotificationService', function($resource) {
  this.notification = $resource('/notification').get();
});

// In your Protractor test
browser.addMockModule('notificatonOverride', function() {
  angular.module('notificationOverride').service('myNotificationService', function() {
    this.notification = {}; // or whatever you need here.
  });
});

答案 1 :(得分:1)

尝试使用browser.driver.get('http://myapp')加载视图。直接调用webdriver api不会等待角度准备就绪。

然后你可以运行脚本。

browser.driver.executeScript('window.runningProtractorTests = true;');

然后继续使用量角器api。

您可能需要添加browser.waitForAngular()以确保在进行测试之前已准备好角度。