您的一些测试进行了整页重新加载 - 运行 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 测试时出错的主要内容,如果未能解决你的问题,请参考以下文章
获取“由于 0 不被接受而中止”并使用 react-hot-loader 重新加载整页