2012-08-07 8 views
9

के साथ कॉल कॉलिंग समस्याएं होने के कारण बैकबोन राउटर पर विधि कॉल करने की समस्याएं यह सुनिश्चित करने के लिए कि किसी दिए गए मार्ग पर सही विधि कहें। परीक्षणबैकबोन.जेएस रूट पर जासूसी जैस्मीन

describe 'Router', -> 
    beforeEach -> 
     @router = new App.Router() 
     Backbone.history.start() 

    afterEach -> 
     Backbone.history.stop() 

    describe 'routes', -> 
     it 'should be defined', -> 
       expect(@router.routes).toBeDefined() 

     describe 'default route', -> 
      it 'should be defined', -> 
        expect(@router.routes['']).toBeDefined() 

      it 'should call index', -> 
       spy = spyOn(@router, "index") 
       @router.navigate('', true) 
       expect(spy).toHaveBeenCalled() 

रूटर

class App.Router extends Backbone.Router 
    routes: 
     '' : 'index' 

    index: -> 
     console.log "router.index has been called" 

सब कुछ अंतिम परीक्षण "सूचकांक बुलाना चाहिए" को छोड़कर गुजरता से

अंश। यह संदेश के साथ विफल रहता है "अपेक्षित जासूसी सूचकांक कहा जाता है"। Ive अन्य वेरिएंट

it "should call index", -> 
    spyOn(@router, "index") 
    @router.navigate('', true) 
    expect(@router.index).toHaveBeenCalled() 

की कोशिश की मैं भी देख सकते हैं मूल Router.index समारोह से परीक्षण उत्पादन में लॉग उत्पादन

धन्यवाद "router.index बुलाया गया है"!

संपादित करें: एक समाधान

describe '#1 Solution', -> 
    it 'should call index', -> 
     spyOn(App.Router.prototype, "index") 
     @router = new App.Router() 
     Backbone.history.start() 
     @router.navigate('', true) 
     expect(App.Router.prototype.index).toHaveBeenCalled() 

उत्तर

15

यह भी ले लिया गया है working jsFiddle के साथ आने के लिए मुझे बहुत समय लगता है और प्रश्न @MarkRushakoff द्वारा पहले से ही उत्तर दिया गया है।

फिर भी मेरे पास कुछ टिप्पणियां हैं।

बैकबोन मार्गों को बाध्य करने का तरीका परीक्षण करने में बहुत मुश्किल बनाता है।

मुद्दा यह है कि रूटर तरीकों रूटर उदाहरण में सीधे नहीं कहा जाता है, के तरीकों कॉलबैक के रूप में taked और निष्पादन, check the Backbone.Router.route code लिए इंतज़ार कर रहे एक आंतरिक Backbone.history.route में संग्रहीत हैं।

इस आपरेशन, पल Router इन्स्तांत है में किया जाता है, ताकि आप अपने Router.methodspy करने से पहले आप संदर्भ का दृष्टांत है, तो के लिए आप भी Backbone.history.start में देरी करने के बाद spy सक्रिय हो गया है है।

राउटर इंस्टेंस बनने से पहले आपको spy घोषित करना होगा, आपको इसे कक्षा स्तर पर करना होगा।

ने कहा तो यह आसान समाधान मैं के साथ आया है:

describe("Router", function() { 
    afterEach(function(){ 
    Backbone.history.stop(); 
    }); 

    it("should call index", function(){ 
    spyOn(App.Router.prototype, "index") 
    var router = new App.Router(); // instance created after spy activation 
    Backbone.history.start();  // it has to start after the Router instance is created 

    router.navigate('', true); 

    expect(App.Router.prototype.index).toHaveBeenCalled(); 
    }); 
}); 

निष्कर्ष, मुझे लगता है कि Backbone.Router कार्यान्वयन एक सहज ज्ञान युक्त डिजाइन नहीं है।

+1

धन्यवाद! ऐसा लगता है कि जाने का रास्ता है :) – eldewall

+0

यह मार्ग के ट्रिगरिंग का परीक्षण करने का एक व्यवहार्य तरीका नहीं है। यह सब परीक्षण है कि इंडेक्स फ़ंक्शन राउटर से कॉलबैक के रूप में बाध्य था, न कि जब मार्ग को ट्रिगर किया गया था तो वास्तव में फ़ंक्शन को बुलाया जाता है। देखें [यह एसओ पोस्ट] (http://stackoverflow.com/questions/9215737/testing-routers-in-backbone-js-properly) यह सत्यापित करने के लिए कि राउटर यूआरएल से मेल खाता है तो संबंधित रूट फ़ंक्शन को कॉल किया गया था। – louism2

4

मैं यकीन है कि इस तरह से है कि रीढ़ अपने मार्ग तरीकों को बांधता है जब आप (एक मार्गों हैश का उपयोग विशेष रूप से यदि आप एक सांत्वना देख रहे हैं के साथ क्या करना है कर रहा हूँ सही ढंग से आउटपुट लॉग करें)। यही है, राउटर मूल index विधि से जुड़ा हुआ है, लेकिन आपके जासूस ने "वर्तमान" index विधि को बदल दिया है। इससे पहले कि आप रूटर मार्गों को बांधता है

  • spyOn(@router, "index") के प्रोटोटाइप के index पद्धति पर (मुश्किल हो सकता है)
  • जासूस::

    आपके पास दो विकल्प spyOn(App.router.prototype, "index"); @router.navigate('', true); expect(App.router.prototype.index).toHaveBeenCalled();

+0

धन्यवाद, यह काम करता है :) विकल्प संख्या दो व्यवहार्य है। राउटर के एक नए उदाहरण से पहले जासूसी को जोड़ा जाना चाहिए। मुझे लगता है कि ठीक है! – eldewall

+0

विकल्प मुझे लगता है कि विकल्प संभव नहीं है क्योंकि _routes binding_ _initialize_ में किया जाता है, इस समय जब आपके पास बाध्यकारी पहले से ही किया गया है। – fguillen

संबंधित मुद्दे