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

问题描述 投票:35回答:12

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

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

我对发生的事感到难过。我添加的测试越多,这就成了问题。有没有人遇到过这个?我不知道是什么导致它,因为我的任何测试都没有进行任何类型的重定向,并且它们都普遍通过另一台人机器。

angularjs unit-testing jasmine karma-jasmine
12个回答
21
投票

在我的情况下,问题是在我的源代码中我有代码直接在位置对象上设置href,如window.location.href ='somewhere';

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

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

0
投票

希望你在代码中使用过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. 
});

0
投票

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


0
投票

它将解决此Karma重定向错误!

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

15
投票

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


6
投票

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

例:

window.onbeforeunload = jasmine.createSpy();

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


2
投票

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


2
投票

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


2
投票

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


1
投票

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


0
投票

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


0
投票

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

spyOn(global, 'setTimeout');
© www.soinside.com 2019 - 2024. All rights reserved.