2009-11-29 3 views
8

Avec mes deux tentatives pour obtenir un message posté sur le JSpec Google Group ayant apparemment échoué, je poste ici à la place.JSpec - RangeError: La taille maximale de la pile d'appels a été dépassée

Je rencontre des problèmes avec JSpec apparemment aller dans une boucle récursive infinie avec un certain type de test (ci-dessous). Des idées? Y at-il quelque chose qui ne va pas avec mon code ou est-ce que c'est JSpec? Je cours JSpec 2.11.2 via Ruby Gem. Les erreurs sont 'RangeError: taille maximale de la pile d'appels dépassée'. (Safari) et 'InternalError: trop de récursion' (FF/Mac). Je peux ajouter un élément à une pièce en utilisant la console Firebug, sans erreur.

Pour reproduire le problème, créez un modèle de projet jspec en utilisant 'jspec init test'. Ensuite, modifiez les fichiers suivants comme ceci:

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

jamais entendu parler de JSpec avant. désolé :(Presque tout votre code semble assez simple pour ne rien rendre fou, sauf peut-être "item.room = this;" – Tei

Répondre

1

Disclaimer: J'ai pas entendu parler de JSpec avant (bien que Jasmine soit une bonne alternative si vous en cherchez un.)

La seule chose à laquelle je peux penser, c'est comment fonctionne la fonction 'être'. S'il descend le graphique d'objet pour trouver si deux éléments sont égaux, alors il pourrait courir dans le hoquet de dépendance circulaire: c.-à-d. Vous référençant votre pièce dans chaque article, qui a vos articles, qui à son tour a vos pièces et etc., etc. Cela finit par être une boucle infinie à partir de laquelle la fonction be ne peut pas retourner efficacement l'inondation de la pile et ainsi jeter l'erreur que vous voyez.

Quelque chose comme ça (sans la comparaison mais aussi: n'ont pas testé ou exécuter ce code, le prendre comme pseudo-code pour expliquer le paragraphe ci-dessus):

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 
    } 
    } 
} 
Questions connexes