2009-11-29 24 views
8

JSpec Google Group पर एक संदेश प्राप्त करने के मेरे दो प्रयासों के साथ स्पष्ट रूप से विफल होने के बाद, मैं इसके बजाय यहां पोस्ट कर रहा हूं।जेएसपीसी - रेंज एरर: अधिकतम कॉल स्टैक आकार

मुझे JSpec के साथ एक निश्चित प्रकार के परीक्षण (नीचे) के साथ एक अनंत रिकर्सिव लूप में जाने में परेशानी हो रही है। कोई विचार? क्या मेरे कोड में कुछ गड़बड़ है या यह जेएसपीसी है? मैं रूबी जेम के माध्यम से जेएसपीसी 2.11.2 चला रहा हूँ।

त्रुटियां हैं 'रेंज एरर: अधिकतम कॉल स्टैक आकार पार हो गया।' (सफारी) और 'आंतरिक त्रुटि: बहुत अधिक रिकर्सन' (एफएफ/मैक)। मैं फ़ायरबग कंसोल का उपयोग कर कमरे में एक आइटम जोड़ सकता हूं, बिना किसी त्रुटि के।

समस्या को पुन: उत्पन्न करने के लिए, '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 एक अच्छा विकल्प है यदि आप एक की तलाश में हैं।

केवल एक चीज जिसे मैं सोच सकता हूं कि 'होना' फ़ंक्शन कैसे काम करता है। यदि ऑब्जेक्ट ग्राफ़ को यात्रा करने के लिए यह पता लगाने के लिए कि क्या दो आइटम बराबर हैं, तो यह परिपत्र निर्भरता हिचकी में चला सकता है: यानी आप प्रत्येक आइटम में अपने कमरे का संदर्भ दे रहे हैं, जिसके बदले में आपके आइटम हैं, जो बदले में आपके कमरे हैं और आगे और आगे की ओर। यह एक अनंत लूप होने के समाप्त होता है जिससे कार्य प्रभावी ढंग से ढेर को बाढ़ नहीं कर सकता है और इस प्रकार आप जो त्रुटि देख रहे हैं उसे फेंक देते हैं।

कुछ इस तरह (तुलना में हालांकि, यह भी बिना: परीक्षण किया है नहीं या इस कोड को चलाने के लिए, उपरोक्त अनुच्छेद की व्याख्या के लिए स्यूडोकोड के रूप में यह लेने के लिए):

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 
    } 
    } 
} 
संबंधित मुद्दे