【问题标题】:Protractor test vs long-polling量角器测试与长轮询
【发布时间】: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


    【解决方案1】:

    您能否将对$resource 的调用放入您使用Protractor 的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.
      });
    });
    

    【讨论】:

    • 谢谢!这听起来不错,我明天试试。我不知道addMockModule...它看起来真的很强大。
    【解决方案2】:

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

    然后你就可以运行脚本了。

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

    然后继续使用量角器api。

    您可能必须添加一个 browser.waitForAngular() 以确保在继续测试之前 angular 已准备就绪。

    【讨论】:

    • 好主意,谢谢!没有机会与这个比赛吗?它总是在网络应用程序初始化之前运行吗? (实际上我已经让后端告诉前端这是一个测试,所以我不再热衷于尝试了。)
    • 希望它会在量角器初始化之前运行,但我不会指望它。下次我们(本周)见面时,我会问量角器团队。也许他们有解决您问题的建议。
    • 哇,太棒了,谢谢!告诉他们量角器是天才:)。
    猜你喜欢
    • 2014-11-16
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多