2009-11-29 2 views
8

С двумя попытками получить сообщение, отправленное в JSpec Google Group, по-видимому, не удалось, вместо этого я размещаю здесь.JSpec - RangeError: превышен максимальный размер стека вызовов

У меня возникли проблемы с JSpec, очевидно, входя в бесконечный рекурсивный цикл с определенным типом теста (см. Ниже). Есть идеи? Это что-то не так с моим кодом или это JSpec? Я запускаю JSpec 2.11.2 через Ruby Gem.

Ошибки: «RangeError: Максимальный размер стека вызовов». (Safari) и «InternalError: слишком много рекурсии» (FF/Mac). Я могу добавить элемент в комнату с помощью консоли Firebug без ошибок.

Чтобы воспроизвести проблему, создайте проект jspec шаблона, используя 'jspec init test'. Затем измените следующие файлы следующим образом:

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 не может эффективно возвращать стек и, таким образом, бросает ошибку, которую вы видите.

Нечто подобное (без сравнения, хотя, также: не тестировал или запустить этот код, считать как псевдокод для пояснения выше пункта):

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 
    } 
    } 
} 
Смежные вопросы