您的一些测试进行了整页重新加载 - 运行 Jasmine 测试时出错

Posted

技术标签:

【中文标题】您的一些测试进行了整页重新加载 - 运行 Jasmine 测试时出错【英文标题】:Some of your tests did a full page reload - error when running Jasmine tests 【发布时间】: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 中,是的。 【参考方案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/1656 和https://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 元素,这可能是原因。

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

【讨论】:

以上是关于您的一些测试进行了整页重新加载 - 运行 Jasmine 测试时出错的主要内容,如果未能解决你的问题,请参考以下文章

在 Ionic 中更改 HTML 时避免整页重新加载

Ionic 4 路由到带有选项卡的视图会触发整页重新加载

获取“由于 0 不被接受而中止”并使用 react-hot-loader 重新加载整页

禁用整页滚动

使用 Selenium Python 和 chromedriver 截取整页截图

Java_动态重新加载Class机制