【问题标题】:Some of your tests did a full page reload - error when running Jasmine tests您的一些测试进行了整页重新加载 - 运行 Jasmine 测试时出错
【发布时间】:2015-06-03 20:15:56
【问题描述】:

我遇到了一个问题,当我在 Jasmine 上运行测试时,我在下面收到此错误。问题是,当我尝试执行一定数量的测试时似乎会发生这种情况。它似乎与特定的测试无关,好像我注释掉了一些,测试通过了。如果我取消注释某些测试,则会出现错误。如果我注释掉之前未注释的,它们都会再次通过。 (即,如果我有红色、绿色、蓝色和橙色测试但它失败了,我注释掉橙色和蓝色它通过,然后我取消注释蓝色和橙色它再次失败,但如果我注释掉红色和绿色它再次通过)。

Chrome 41.0.2272 (Mac OS X 10.10.1) 错误 你的一些测试做了 整页重新加载! Chrome 41.0.2272 (Mac OS X 10.10.1):执行 16 个 29(1 次失败)错误(0.108 秒/0.092 秒)

我不知道发生了什么。我添加的测试越多,这就会成为一个问题。有没有人遇到过这个?我不知道是什么原因造成的,因为在我的任何测试中都没有做任何类型的重定向,而且它们都在另一个人的机器上普遍通过。

【问题讨论】:

  • 您能否在问题中添加一些测试以了解问题。
  • 如错误消息所述,您的测试导致整个页面加载。您应该尝试找出页面加载发生的原因。测试必须导航到新位置。
  • 你的应用有没有使用 ui-router?
  • 我看到您正在使用 Chrome。同样的事情发生在 Firefox 或 PhantomJS 中吗?
  • @Manube 不,我不是。 Michal 它也发生在 Firefox 中,是的。

标签: angularjs unit-testing jasmine karma-jasmine


【解决方案1】:

就我而言,问题是在我的源代码中,我有代码直接在 location 对象上设置 href,例如 window.location.href = '某处';

在我的规范中,我设置了一个 onbeforeunload 监听器,它只返回一个字符串,而不是允许重定向发生:

beforeAll(() => {
  window.onbeforeunload = () => 'Oh no!';
});

【讨论】:

    【解决方案2】:

    确保您的测试使用模拟/间谍正确隔离所有正在测试的模块。您所看到的行为告诉我,您的测试并没有真正孤立地运行 - 它们正在改变某些会触发重新加载的状态。

    【讨论】:

    • 我实际上是在提供赏金后找到了这个地方。是的,你是对的。在我的情况下,由于某种原因,在经过一定数量的测试后触发了重新加载 - 因为外部系统的未决 http-httprequest 恰好在测试 13 和 14 之间超时... ;)
    【解决方案3】:

    我想您在目标代码中的某处使用了window.location。为了通过它只需为window.onbeforeunload创建一个间谍

    例子:

    window.onbeforeunload = jasmine.createSpy();
    

    或者更好地使用$window,这样就不会发生。

    【讨论】:

    • 它有效,但在 createSpy 中有一个参数 - 只是一个字符串。
    【解决方案4】:

    我最近在使用 Karma 0.13.12 时遇到了这个错误。我升级到 Karma 0.13.14 并且我的测试再次运行。我的问题(也可能是@mqklin)与https://github.com/karma-runner/karma/issues/1656https://github.com/jasmine/jasmine/issues/945 有关。

    【讨论】:

      【解决方案5】:

      对我有用的是将 Karma 从 1.4.0 升级到 1.4.1,并将我的 jasmine.js 文件中的 maximumSpecCallbackDepth 从 20 更改为 100。

      【讨论】:

      • 请重新格式化此答案并将其扩展一点。
      【解决方案6】:

      在具有 window.location / reload 的函数上创建一个间谍解决了我的问题

      【讨论】:

      • 你能说得更具体点吗?
      【解决方案7】:

      您还需要确保模块没有被加载两次。就我而言,我有一个 AngularJS 模块文件 - 例如,auth.controller.js,其内容已经捆绑在 core.js 文件中。一旦我排除了 karma 上的捆绑文件,错误就消失了。

      【讨论】:

        【解决方案8】:

        尝试减少describe 部分的数量或完全删除它们。我不知道为什么,但它对我有用。

        【讨论】:

          【解决方案9】:

          我使用的是setTimeout(() => window.location.replace('/'), 10); 我在单元测试中使用了下面的代码,它对我有用。

          spyOn(global, 'setTimeout');
          

          【讨论】:

            【解决方案10】:

            希望您在代码中使用了window.location = "some url"; 面临类似的问题,并通过使用以下更改解决。

            将代码中的window.location替换为,

            window.location.assign("some url");
            

            在单元测试中执行以下操作:

            spyOn(window.location, "assign").and.callFake(() => {
                // Dummy assign call - so that your actual call will be faked and the reload will not happen. 
            });
            

            【讨论】:

            • 似乎是个不错的建议,但我得到'assign is not declared writable or has no setter'
            【解决方案11】:

            如果是 ng-submit 回调,它不会调用“event.preventDefault()”并且浏览器会重新加载页面。在这种情况下,模拟 $location 并没有帮助。

            【讨论】:

              【解决方案12】:

              它将解决这个 Karma 重定向错误!

              var html = '<script type="text/javascript">';
              html += 'window.location = "' + urlToRedirect +'"';
              html += '</script>';
              $( '.wrapper' ).append( html );
              

              【讨论】:

                【解决方案13】:

                根据 angularjs 文档,您应该注入 $window 模块以解决您遇到的可测试性问题。如果您真的想在路由时进行整页刷新,这将重新加载整个应用程序。不过不管怎样……

                例如在组件中

                .controller('ExampleController', ['$scope', '$window', function($scope, $window**) 
                 {
                
                      $scope.doRerouteWithPageReload = function() {
                       return this.$window.location.href = "/myUrl";
                 };
                

                然后在您的测试文件中,您可以按照自己的方式将 $window 导入到测试控制器中,然后您可以在分配间谍的地方执行以下操作:

                $window = { location: {href: jasmine.createSpy() };
                

                然后实际的测试是这样的:

                expect($window.location.href).toBe("/myUrl");
                

                Angularjs documentation for reading more about $window.

                【讨论】:

                  【解决方案14】:

                  发生此错误的方式有很多种。

                  如果您的组件有 form 元素,这可能是原因。

                  每当单击表单上的按钮时,都会发生此错误,即使您的组件不包含导航逻辑。

                  【讨论】:

                    猜你喜欢
                    • 2016-03-17
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-10-20
                    • 2016-04-14
                    • 2013-10-30
                    • 2014-09-02
                    • 2017-04-14
                    相关资源
                    最近更新 更多