代码之家  ›  专栏  ›  技术社区  ›  Rich Apodaca

JSpec-RangeError:超过了最大调用堆栈大小

  •  8
  • Rich Apodaca  · 技术社区  · 15 年前

    我两次试着在 JSpec Google Group 显然失败了,我改在这里发帖。

    我有麻烦了 JSpec 显然,进入了一个无限递归循环与某种测试(如下)。有什么想法吗?是我的代码出了问题还是JSpec出错了?我通过rubygem运行jspec2.11.2。

    错误是“RangeError:Maximum call stack size exceeded.”(Safari)和“InternalError:too Many recursion”(FF/Mac)错误。我可以使用Firebug控制台将一个项目添加到一个房间,没有错误。

    若要重现该问题,请使用“jspec init test”创建一个模板jspec项目。然后按如下方式编辑以下文件:

    你的lib.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
    
    1 回复  |  直到 15 年前
        1
  •  1
  •   Mutahhir    12 年前

    免责声明:我以前也没听说过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
        }
      }
    }