所以,这是我的第一个项目,我使用Karma和Jasmine对我的angularJS代码进行单元测试。使用Yeoman角度发生器进行设置。
一旦我进行了11次测试,我就会收到一条错误消息"您的某些测试会进行整页重新加载"。我没有做任何会引发重新加载的测试。
深入挖掘我看到Github上引用了同样的问题。 https://github.com/jasmine/jasmine/issues/366 - (FuzzySockets评论)
问题似乎源于jasmine-core中的一行代码 https://github.com/jasmine/jasmine/blob/master/lib/jasmine-core/jasmine.js
为了避免堆栈溢出,maximumSpecCallbackDepth
设置为20.每次currentSpecCallbackDepth
超过该值时,使用setTimout
函数在新堆栈上执行进一步的测试。
这条线似乎会导致问题并使业力抛出错误。 (我已经通过在我自己的单元测试中调用setTimeout
方法验证了这一点,并且它抛出了同样的错误。)
如果将maximumSpecCallbackDepth
更改为100,我的测试运行正常,最后不会抛出任何错误
有没有人看过这个问题并知道修复?我使用的是最新版本的业力(0.13.15)和茉莉(2.4.1)。
除了我使用镀铬发射器而不是默认的幻影,所以我没有真正搞乱使用自动生成的默认咕噜声或karma配置,所以我不会&#39了解其他人在这里是如何面对同样的问题的。
答案 0 :(得分:1)
此问题的+1。正如你所说,它是由maximumSpecCallbackDepth限制造成的,但到目前为止我没有找到解决这个问题的方法。您可能可以在https://github.com/karma-runner/karma/issues/1101跟踪问题。
一个临时解决方案是减少项目中嵌套的“describe”块。
答案 1 :(得分:1)
我遇到了一个类似的问题,即全局beforeEach中的角度注入停止工作,所有测试在maximumSpecCallbackDepth的20限制后失败。
在调查期间,我发现当达到该限制时,angular-mock与茉莉花中的setTimeout不能很好地匹配。
以下代码作为示例在每个测试用例中创建一个新的注入器:
var yourService;
beforeEach(module('app'));
beforeEach(inject(function(_yourService_) {
yourService = _yourService_;
}));
相反,您可以执行以下操作,它将使用单个注入器并仅注册您的模块一次。
var yourService;
module.sharedInjector();
beforeAll(module('app'));
beforeEach(inject(function(_yourService_) {
yourService = _yourService_;
}));
希望这可能对其他人有所帮助,因为我花了差不多一个星期的时间才发现这是问题的根本原因而不是像某些人在github上想的那样茉莉花。