2009-11-29 8 views
8

Con mis dos intentos de obtener un mensaje publicado en el JSpec Google Group habiendo aparentemente fallado, estoy publicando aquí en su lugar.JSpec - RangeError: el tamaño máximo de pila de llamadas superó

Estoy teniendo problemas con JSpec aparentemente entrando en un bucle recursivo infinito con cierto tipo de prueba (abajo). ¿Algunas ideas? ¿Hay algo mal con mi código o es JSpec? Estoy ejecutando JSpec 2.11.2 a través de Ruby Gem.

Los errores son 'RangeError: se ha excedido el tamaño máximo de pila de llamadas'. (Safari) y 'InternalError: demasiada recursividad' (FF/Mac). Puedo agregar un elemento a una habitación usando la consola Firebug, sin errores.

Para reproducir el problema, cree una plantilla de proyecto jspec usando 'jspec init test'. A continuación, edite los siguientes archivos de este 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

nunca oído hablar de JSpec antes. lo siento :(. Casi todo su código parece lo suficientemente simple como para no hacer que nada enloquezca, excepto tal vez "item.room = this;" – Tei

Respuesta

1

responsabilidad: Tampoco he oído hablar de JSpec antes (aunque Jasmine es una buena alternativa si está buscando una.

Lo único que se me ocurre es cómo funciona la función 'ser'. Si se desplaza hacia abajo en el gráfico de objetos para encontrar si dos elementos son iguales, entonces podría encontrarse con el problema de dependencia circular: es decir, está haciendo referencia a su habitación en cada elemento, que a su vez tiene sus elementos, que a su vez tiene sus habitaciones y y así sucesivamente. Esto termina siendo un bucle infinito desde el cual la función be no puede regresar inundando efectivamente la pila y arrojando el error que estás viendo.

Algo como esto (y sin embargo la comparación, también: no se han probado o ejecutar este código, tomarlo como pseudocódigo para explicar el párrafo anterior):

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 
    } 
    } 
} 
Cuestiones relacionadas