2009-11-29 41 views
8

Với hai lần thử nhận tin nhắn được đăng lên JSpec Google Group có vẻ không thành công, tôi sẽ đăng bài ở đây thay thế.JSpec - RangeError: Kích thước ngăn xếp cuộc gọi tối đa vượt quá

Tôi đang gặp sự cố với JSpec dường như đi vào vòng lặp đệ quy vô hạn với một loại thử nghiệm nhất định (bên dưới). Bất kỳ ý tưởng? Nó có cái gì sai với mã của tôi hoặc là nó JSpec? Tôi đang chạy JSpec 2.11.2 thông qua Ruby Gem.

Lỗi là 'RangeError: Kích thước ngăn xếp cuộc gọi tối đa đã vượt quá.' (Safari) và 'InternalError: quá nhiều đệ quy' (FF/Mac). Tôi có thể thêm một mục vào một phòng bằng cách sử dụng giao diện điều khiển Firebug, không có lỗi.

Để tái tạo sự cố, hãy tạo dự án mẫu jspec bằng 'jspec init test'. Sau đó chỉnh sửa các tập tin sau như vậy:

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

Chưa bao giờ nghe nói về JSpec trước. Rất tiếc: (Hầu như tất cả mã của bạn dường như đủ đơn giản để không làm bất cứ điều gì phát điên, ngoại trừ có lẽ "item.room = this;" – Tei

Trả lời

1

Disclaimer: Tôi cũng chưa nghe nói về JSpec trước (mặc dù Jasmine là một lựa chọn tốt nếu bạn đang tìm kiếm một.

điều duy nhất mà tôi có thể nghĩ đến là cách hoạt động của hàm 'be'. Nếu nó di chuyển xuống đồ thị đối tượng để tìm xem hai mục có bằng nhau hay không, thì nó có thể chạy vào hiccup phụ thuộc vòng tròn: tức là bạn đang tham chiếu phòng của bạn trong mỗi mục. Vv và vv. Điều này kết thúc là một vòng lặp vô hạn mà từ đó các chức năng được không thể trở lại có hiệu quả lũ lụt ngăn xếp và do đó ném các lỗi bạn đang nhìn thấy.

Something như thế này (mà không có sự so sánh, mặc dù cũng: đã không kiểm tra hoặc chạy mã này, coi đó là giả để giải thích đoạn trên):

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 
    } 
    } 
} 
Các vấn đề liên quan