2009-11-29 88 views
8

我的兩次嘗試將消息發佈到JSpec Google Group明顯失敗,我在這裏發佈。JSpec - RangeError:超過最大調用堆棧大小

我在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 
+0

從來沒有聽說過JSpec之前。對不起:(幾乎所有的代碼看起來很簡單,不會讓任何事情變得瘋狂,除了「item.room = this;」 – Tei

回答

1

聲明:我還沒有聽說過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 
    } 
    } 
} 
相關問題