2009-11-29 14 views
8

Con i miei due tentativi di ottenere un messaggio inviato a JSpec Google Group apparentemente non riuscito, sto postando qui invece.JSpec - RangeError: Dimensione massima dello stack di chiamate superata

Ho problemi con JSpec apparentemente andando in un ciclo ricorsivo infinito con un certo tipo di test (sotto). Qualche idea? C'è qualcosa di sbagliato nel mio codice o è JSpec? Sto eseguendo JSpec 2.11.2 tramite Ruby Gem.

Gli errori sono "RangeError: superata la dimensione massima dello stack di chiamate". (Safari) e 'InternalError: too recursion' (FF/Mac). Posso aggiungere un oggetto a una stanza usando la console di Firebug, senza errori.

Per riprodurre il problema, creare un modello jspec project utilizzando 'jspec init test'. Poi modificare i seguenti file in questo modo:

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

Mai sentito parlare di JSpec prima. scusa :(. Quasi tutto il tuo codice sembra abbastanza semplice da non far impazzire niente, tranne forse "item.room = this;" – Tei

risposta

1

di responsabilità: anche io non ho sentito parlare di JSpec prima (anche se Jasmine è una buona alternativa se stai cercando uno.

Il l'unica cosa a cui riesco a pensare è come funziona la funzione 'be'. Se percorre il grafico degli oggetti per scoprire se due elementi sono uguali, allora potrebbe incappare nel singhiozzo di dipendenza circolare: cioè stai facendo riferimento alla tua stanza in ogni oggetto, che a sua volta ha i tuoi oggetti, che a loro volta hanno le tue stanze e Così via. Questo finisce per essere un ciclo infinito da cui la funzione be non può tornare efficacemente inondando lo stack e quindi gettando l'errore che stai vedendo.

Qualcosa di simile (senza il confronto, però, anche: non sono testati o eseguire questo codice, prendere come pseudocodice per spiegare il paragrafo precedente):

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 
    } 
    } 
} 
Problemi correlati