由于我两次尝试将消息发布到JSpec Google Group显然都失败了,因此我将其发布在这里。
我对JSpec遇到麻烦,显然要通过某种测试(下面)进入无限递归循环。有任何想法吗?我的代码有问题吗?还是JSpec?我正在通过Ruby Gem运行JSpec 2.11.2。
错误为“RangeError:超出最大调用堆栈大小”。 (Safari)和“InternalError:太多的递归”(FF/Mac)。我可以使用Firebug控制台将项目添加到房间,而不会出现任何错误。
要重现该问题,请使用“jspec init test”创建一个模板jspec项目。然后像这样编辑以下文件:
yourlib.core.js
var Game = {};
Game.item = function () {
var result = {
name : 'Undefined',
room : null
}
return result;
};
Game.room = function () {
var result = {
items : [],
addItem : function (name) {
var item = Game.item();
item.name = name;
item.room = this;
this.items.push(item);
return item;
}
};
return result;
};
spec.core.js
describe 'Room'
before_each
room = Game.room()
end
describe 'addItem()'
before_each
potion = room.addItem('Potion')
key = room.addItem('Key')
end
//this is fine
it 'should return two different items'
key.should_not.be potion
end
//InternalError: too much recursion
it 'should not give recursion error'
key.should.be potion
end
end
end
最佳答案
免责声明:我以前也没有听说过JSpec(尽管Jasmine是一个不错的选择。
我唯一想到的就是“be”功能的工作方式。如果它沿着对象图向下移动以发现两个项目是否相等,那么它可能会遇到循环依赖问题:即,您要在每个项目中引用您的房间,该房间又包含您的项目,而房间又包含您的房间和等等等等。这最终是一个无限循环,be函数无法从该循环中有效地返回堆栈,从而淹没了堆栈,从而引发了您所看到的错误。
像这样的东西(尽管没有进行比较,但是:没有测试或运行此代码,将其作为用于解释以上段落的伪代码):
function be(obj) {
for (var key in obj) {
if (typeof(obj[key]) === "object") {
be(obj[key]); // If you have circular dependencies, the recursion never ends
}
}
}