2012-03-08 15 views
9

मैं बैकबोन व्यू के लिए एक परीक्षण लिख रहा हूं ताकि परीक्षण किया जा सके कि मॉडल लाने के बाद रेंडर फ़ंक्शन को बुलाया जा रहा है। परीक्षा है:Backbone.js ब्राउज़र में साइनऑन जासूसों का उपयोग करके परीक्षण देखें

beforeEach(function() { 
    $('body').append('<div class="sidebar"></div>'); 
    profileView = new ProfileView(); 
}); 

it('should call the render function after the model has been fetched', function (done) { 
    profileView.model = new UserModel({md5: 'd7263f0d14d66c349016c5eabd4d2b8c'}); 
    var spy = sinon.spy(profileView, 'render'); 
    profileView.model.fetch({ 
     success: function() { 
      sinon.assert.called(spy); 
      done(); 
     } 
    }); 
}); 

मैं profileView दृश्य वस्तु के समारोह प्रस्तुत करने के लिए एक जासूस वस्तु संलग्न करने के लिए सिनोन जासूसों का उपयोग कर रहा हूँ।

दृश्य है:

var ProfileView = Backbone.View.extend({ 
    el: '.sidebar' 
    , template: Hogan.compile(ProfileTemplate) 
    , model: new UserModel() 
    , initialize: function() { 
     this.model.bind('change', this.render, this); 
     this.model.fetch(); 
    } 
    , render: function() { 
     $(this.el).html(this.template.render()); 
     console.log("Profile Rendered"); 
     return this; 
    } 
}); 

लाने की परीक्षा में कहा जाता है के बाद, परिवर्तन घटना फायरिंग कर रहा है और देखने के प्रस्तुत करना समारोह बुलाया जा रहा है, लेकिन सिनोन जासूस का पता लगाने नहीं है कि प्रस्तुत करना है किया जा रहा है बुलाया और विफल रहता है।

एक प्रयोग के रूप में, मैं परीक्षा में समारोह प्रस्तुत करना बुला देखने के लिए अगर जासूस यह पहचान करने की कोशिश की:

it('should call the render function after the model has been fetched', function (done) { 
    profileView.model = new UserModel({md5: 'd7263f0d14d66c349016c5eabd4d2b8c'}); 
    var spy = sinon.spy(profileView, 'render'); 
    profileView.render(); 
    profileView.model.fetch({ 
     success: function() { 
      sinon.assert.called(spy); 
      done(); 
     } 
    }); 
}); 

जासूस का पता चला बुलाया उपरोक्त मामले में किया गया था।

क्या किसी को पता है कि जासूस मेरे प्रारंभिक परीक्षण में रेंडर कॉल की पहचान क्यों नहीं कर रहा है?

उत्तर

25

समस्या यह है कि दृश्य के निर्माण के दौरान, प्रारंभिक कार्य एक बाध्य करता है समारोह को सीधे प्रस्तुत करने के लिए घटना। आप इस घटना को जासूसी से रोक नहीं सकते क्योंकि बाध्यकारी पहले से ही आपके जासूस को सेट करने से पहले ही हो चुकी है (जो आप निर्माण के बाद करते हैं)।

समाधान बनाने से पहले प्रोटोटाइप पर जासूसी करना है। तो आपको जासूस को पहले से ही ले जाना होगा, या दृश्य में दृश्य के निर्माण को स्थानांतरित करना होगा।

सेट करने के लिए

जासूस:

ProfileView.prototype.render.restore() 

यह फिर 'साधारण' पर जासूसी करेगा प्रस्तुत करना करने के लिए कॉल, साथ ही से परिवर्तन घटना:

this.renderSpy = sinon.spy(ProfileView.prototype, 'render'); 
this.view = new ProfileView(); 

फिर बाद में, जासूसी दूर करने के लिए आदर्श।

3

सिर्फ 3 अनुमान:

  1. आप मान रहे हैं कि fetch({ success }) कॉलबैक के बाद Model अद्यतन किया गया है और मॉडल ईवेंट को ट्रिगर करने बुलाया जा रहा है .. और शायद यह पसंद नहीं है। समाधान: here के आसपास डीबगिंग खेलें।
  2. शायद fetch कॉल सफलता नहीं है इसलिए सफलता कॉलबैक नहीं कहा जाता है। समाधान: त्रुटि कॉलबैक को fetch पर जोड़ने का प्रयास करें ताकि यह देखने के लिए कि क्या वहां भेजा गया है या नहीं।
  3. Model.validate प्रतिक्रिया false, बहुत संभव नहीं है यदि आपने इसे लागू नहीं किया है।

0

यह मेरे लिए काम किया (मैं 2. के लिए शर्त), हालांकि जासूस संग्रह में प्रयोग किया जाता है:

var thatzzz = this; 
    this.hcns.fetch({ 
     success: function(){ 
      expect(thatzzz.hcnsFetchSpy).toHaveBeenCalled(); 
     } 
}); 
  • जासूस beforeEach
  • पर परिभाषित किया गया था
संबंधित मुद्दे