【问题标题】:How to test applications that use long polling with Protractor如何使用 Protractor 测试使用长轮询的应用程序
【发布时间】:2016-11-01 18:17:49
【问题描述】:

我正在构建一个 Angular 应用程序,该应用程序使用长轮询来在服务器发生变化时接收快速更新。我像这样使用 $resource 来获取实际数据:

appServices.factory('Data', ['$resource', 
  function(){
    return $resource('', {}, {
        query: {"url": …, isArray: false}
  });
}]);

然后我有一个服务来处理长轮询:等待数据加载;将它们存放在某个地方;一秒钟后,开始下一个长轮询周期:

app.factory(„DataLoader“, [„Data“, "$timeout", function(Data, $timeout) {
    return {
            loadData: function() {
                var parent = this;
                var data = Data.query({},
                        function(result) {
                          /* do something to the data,
                           * then start waiting for an update from the server again
                           */
                           $timeout(function() {
                                parent.loadData();
                           }, 1000);
                        }
                );
            }
     };
});

到目前为止,它就像一个魅力。

但是,我现在正在尝试为此编写量角器测试。问题是:只有在数据没有变化的情况下,服务器才会在 30 秒后超时长轮询请求。当我在 $timeout 内等待新数据时,量角器会在任何结果到达之前超时。

我在最后一个小时用谷歌搜索了,但似乎没有解决方案,除了使用 $interval 而不是 $timeout。这适用于一个很好的旧轮询设置(每 3 秒轮询一次,如果没有新内容,则从服务器获取空结果)。但是,为了避免这种情况,我实施了长轮询。 $timeout 对我来说是更明智的选择。

您能给我一些提示如何让 Protractor 在这种环境中成功运行吗?

【问题讨论】:

  • 如果您不想使用$interval,我认为您唯一的其他选择就是禁用量角器与 Angular 的同步。 browser.ignoreSynchronization = true;不确定是否有其他选择
  • 感谢@Gunderson 的提示!我最终这样做了,然后手动等待 DOM 元素使用预期条件出现。

标签: angularjs protractor long-polling


【解决方案1】:

我建议看看Protractor's documentation on timeouts。您可能需要在配置文件中增加 allScriptsTimeout,因为默认的页面同步等待时间为 11 秒。

【讨论】:

  • 也想过这个问题,唯一的问题是测试执行需要非常多的时间。
  • @fjc 你有解决这个问题的办法吗?
  • 我最终打开了 browser.ignoreSynchronization 并增加了超时。不是一个非常令人满意的解决方案。使用 Angular + RXJS,这一切变得更容易测试。因此,如果可以选择,我建议只迁移到 Angular。
  • 增加 allScriptsTimeout 不会对测试产生任何影响,因为页面会不断轮询并且量角器会无限期地等待,所以即使您增加 allScriptsTimeout 只会延迟测试更多时间并且失败了。
【解决方案2】:

使用$interval angular api 和$fetch 在您的应用中连续轮询数据

如果您不想使用$interval 而不是$timeout;这不是一个好习惯, 那么你必须关闭浏览器与 Angular 的同步 browser.waitForAngularEnabled(false) 并使用 browser.sleep()browser.wait() 来实现你在页面上交互的元素之间的同步。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-15
    • 2015-01-07
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    相关资源
    最近更新 更多