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

时间:2015-03-30 17:33:13

标签: angularjs unit-testing jasmine karma-jasmine

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

  

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秒)

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

13 个答案:

答案 0 :(得分:21)

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

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

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

答案 1 :(得分:15)

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

答案 2 :(得分:6)

我认为您在目标代码中的某处使用了window.location。为了传递它,只需为window.onbeforeunload

创建一个间谍

示例:

window.onbeforeunload = jasmine.createSpy();

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

答案 3 :(得分:2)

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

答案 4 :(得分:2)

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

答案 5 :(得分:2)

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

答案 6 :(得分:1)

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

spyOn(global, 'setTimeout');

答案 9 :(得分: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. 
});

答案 10 :(得分:0)

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

答案 11 :(得分:0)

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

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

答案 12 :(得分:0)

根据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.