2009-11-29 5 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 프로젝트 템플릿을 만드십시오. 다음과 같이 다음과 같은 파일을 편집 :

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

책임의 한계와 법적 고지 yourlib.core.js : 나는 또한 JSpec 들어하지 않은 전에 (Jasmine은 좋은 대안입니다.)

내가 생각할 수있는 유일한 점은 '될'기능이 어떻게 작동하는지입니다. 두 항목이 같은지 알아보기 위해 개체 그래프를 따라 이동하면 순환 종속성 문제가 발생할 수 있습니다. 즉, 각 항목에서 방을 참조하면 차례대로 항목이 있고 차례로 방이 있고 등등. 이것은 함수가 효과적으로 스택에 넘쳐서 반환 할 수없는 무한 루프가되어 결국보고있는 오류를 던집니다. 이 같은

뭔가 (하지만, 또한 비교하지 않고는 : 시험 또는,이 코드를 실행 위의 단락을 설명하기위한 의사로하지 않은) :

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