我遇到了一个问题,当我在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秒)
我很难知道发生了什么事。我添加的测试越多,这就成了问题。有没有人遇到过这个?我不知道是什么导致它,因为我的任何测试都没有做任何重定向,并且它们都普遍通过另一台人机。
答案 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/1656和https://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.locationwindow.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");