2012-08-23 9 views
5

AJAXRequest (1) (2) को लागू करने के निम्नलिखित दो तरीके बराबर होना चाहिए।
कहा करने के बाद कि:jQuery AJAX अनुरोध कैसे जासूसी करने के लिए?

  1. क्यों इकाई परीक्षण (3) कि कॉलबैक मार डाला गया था की पुष्टि करता है, (1) में सफल होता है और (2) में विफल रहता है?
  2. सफलता कॉलबैक पर जासूसी करने के लिए परीक्षण (3) को फिर से लिखना चाहिए (2)?
  3. यदि मैं साइनन और कोड (2) का उपयोग कर stub jQuery.ajax करने का प्रयास करता हूं तो मुझे एक त्रुटि मिलती है। मुझे इसे कैसे ठीक करना चाहिए?

कृपया, अधिक जानकारी के लिए कोड (3) में टिप्पणियां देखें।


(1)

ajaxRequest: function (message, callback) { 
    return $.ajax({ 
     url: backendRouter.generate('feedback_send'), 
     type: 'POST', 
     dataType: 'json', 
     data: { 
      message: message 
     }, 
     success: callback 
    }); 
} 

(2)

ajaxRequest: function (message, callback) { 
    return $.ajax({ 
     url: backendRouter.generate('feedback_send'), 
     type: 'POST', 
     dataType: 'json', 
     data: { 
      message: message 
     } 
    }).success(callback); 
} 

(3)

it("should execute the callback function on success", function() { 
    spyOn($, "ajax").andCallFake(function(options) { 
     options.success(); 
    }); // If I use the code (2) I get the following error 
     // TypeError: Object #<Object> has no method 'success' 
    var callback = jasmine.createSpy(); 
    ajaxRequest('some message', callback); 
    expect(callback).toHaveBeenCalled(); 
}); 
बाद

return $.ajax({ 
    url: backendRouter.generate('feedback_send'), 
    type: 'POST', 
    dataType: 'json', 
    data: { 
    message: message 
    } 
... 

:

आप नंबर 2 में कोड का उपयोग करते हैं, तो आप jQuery पर ajax समारोह लागू कर रहे हैं:


(4)

it("makes a GET request for todo items", function() { 
    sinon.stub(jQuery, 'ajax'); 
    backendController.ajaxRequest('some message', sinon.spy()); 
    // Cannot call method 'success' of undefined 
}); 

उत्तर

4

यहाँ एक पूर्वाभ्यास है इस पैरामीटर को उन पैरामीटर के साथ कॉल करना, jQuery एक jqHR देता है जो एक सफल फ़ंक्शन परिभाषित होता है। यही कारण है कि सफलता समारोह तो शुरू हो जाती है:

... 
}).success(callback); 

सभी अब तक ajax समारोह पर अपने चमेली परीक्षण जासूसों जब तक अच्छी तरह से है। $.ajax को आमंत्रित करने के लिए आपके द्वारा उपयोग किए जाने वाले वही विकल्प इस नए जासूस को पास कर दिए जाते हैं।

// this is the value of the options parameter 
{ 
    url: backendRouter.generate('feedback_send'), 
    type: 'POST', 
    dataType: 'json', 
    data: { 
     message: message 
    } 
} 

जब इस वस्तु पारित हो जाता है, अपने नकली समारोह वास्तव में options.success है, जो अस्तित्व में नहीं है कॉल करने के लिए प्रयास करता है! इसलिए त्रुटि।

+0

+1 धन्यवाद पर एक नजर डालें। असल में अब मैं कोड (2) पर चलाने के लिए एक परीक्षण (3) लिखना चाहता हूं। क्या आपको कुछ विचार है कि इसे कैसे बनाया जाए? मैंने अपना प्रश्न अपडेट किया। धन्यवाद। –

+0

जाहिर है, .success() कॉल jQuery 1.8 में बहिष्कृत किया जाएगा। मेरा सुझाव है कि AJAX विधि को नकल करने के लिए जैस्मीन का उपयोग करने के बजाय आप sinon.js (http://sinonjs.org/) देखें जो वास्तव में आपके ब्राउज़र के मूल XHR का नकल करेगा। यह मेरे लिए बहुत अच्छा काम करता है। – badunk

+0

मैंने jQuery.ajax 'stub करने की कोशिश की, मेरा प्रश्न, कोड (4) देखें। और मुझे मिलता है और त्रुटि, क्यों? मुझे 'sinonjs.org' का उदाहरण क्या मिलेगा? –

1

एक jquery प्लगइन है जो sinonjsqunit के साथ उपयोग करता है और AJAX परीक्षण लिखने और अपेक्षित परिणाम प्राप्त करने का एक आसान तरीका प्रदान करता है।

अपने पूर्वाभ्यास के लिए jqueryspy

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