javascript – 试图在Array.prototype方法上窥探(Jasmine)会导致堆栈溢出
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 试图在Array.prototype方法上窥探(Jasmine)会导致堆栈溢出,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1920字,纯文字阅读大概需要3分钟。
内容图文
![javascript – 试图在Array.prototype方法上窥探(Jasmine)会导致堆栈溢出](/upload/InfoBanner/zyjiaocheng/824/be619e41baca46889df6013fc5b9ba1e.jpg)
这很奇怪.使用带有jasmine2的testem runner和以下规范执行(虽然它正确地标记了没有期望):
describe('Spying on array.prototype methods', function(){
it('should work this way', function(){
spyOn( Array.prototype, 'push' ).and.callThrough();
// expect(1).toBe(1);
});
});
但是,添加一个expect(任何期望!)并且它会导致堆栈溢出,并在testem控制台中显示以下消息:RangeError:超出最大调用堆栈大小.在http:// localhost:7357 / testem / jasmine2.js,第980行html报告页面符合规范,然后挂起而不显示任何实际结果.
最终我想做这样的事情:
describe('Some structure.method', function(){
it('does not use native push', function(){
spyOn( Array.prototype, 'push' ).and.callThrough();
[].push(1); // actually more like `myStructure.myMethod('test')`
expect( Array.prototype.push ).not.toHaveBeenCalled();
});
});
提前感谢能够揭示这种奇怪之处的人.我可以不监视原生原型方法吗?
解决方法:
当你监视某些事情时,jasmine创建一个包装器以跟踪该函数的调用.这里当您监视原型方法时,基本上即使是jasmine中的push操作也会调用spy而不是数组上的实际push方法,它会导致无限循环.
当你调用[] .push(1)它实际上是calls the tracker,如下所示:
spy = function() {
callTracker.track({ //<-- Calls tracker to track invocation
object: this,
args: Array.prototype.slice.apply(arguments)
});
它又将呼叫跟踪器和pushes the call context调用到其内部跟踪器阵列,然后进入递归循环,直到调用堆栈爆炸.
this.track = function(context) {
calls.push(context); //Now this again calls the spy
};
相反,如果你监视数组实例上的方法,你将不会遇到这个问题,因为它为该数组实例的push属性创建了一个间谍包装器(或者换句话说,引用(当前继承自Array原型)实例被jasmine创建的间谍的新函数引用覆盖:示例:
it('does not use native push', function(){
var arr = [];
spyOn(arr, 'push' ).and.callThrough();
arr.push(1);
expect(arr.push).toHaveBeenCalledWith(1);
});
但作为一个真实的用例(至少我从来没有)你总是可以检查目标数组的长度,并在特定操作后得到最后一项要比较的项目.您可能永远不需要监视本机方法(至少不是数组:)),而是针对您感兴趣的对象进行测试并监视这些目标方法.
内容总结
以上是互联网集市为您收集整理的javascript – 试图在Array.prototype方法上窥探(Jasmine)会导致堆栈溢出全部内容,希望文章能够帮你解决javascript – 试图在Array.prototype方法上窥探(Jasmine)会导致堆栈溢出所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。