2012-08-23 18 views
5

Następujące dwa sposoby implementacji ajaxRequest (1) (2) powinny być równoważne.
Mimo, że:Jak śledzić żądanie jQuery AJAX?

  1. Dlaczego testów jednostkowych (3), który weryfikuje zwrotnego został stracony, udaje się (1), a nie w (2)?
  2. W jaki sposób powinienem przepisać test (3) w celu sprawdzenia oddzwaniania powodzenia w (2)?
  3. Jeśli spróbuję użyć stub jQuery.ajax używając sinon i kodu (2) otrzymuję błąd. Jak mam to naprawić?

Proszę zobaczyć komentarze w kodzie (3), aby uzyskać więcej informacji.


(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(); 
}); 

(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 
}); 

Odpowiedz

4

Oto solucja:

Jeśli używasz kodu z numerem 2, jesteś wywoływanie funkcji ajax na jQuery:

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

po wywołując tę ​​funkcję za pomocą tych parametrów, jQuery zwraca wartość jqHR, która ma zdefiniowaną funkcję sukcesu. Że sukces jest wtedy funkcja wywoływana:

... 
}).success(callback); 

Wszystko jest dobrze do tej pory, aż jaśminu testowych szpiegów o funkcji ajax. Te same opcje, które zostały użyte do wywołania $.ajax, są przekazywane temu nowemu szpiegowi.

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

Gdy obiekt zostanie przekazany, twoja fałszywa funkcja faktycznie próbuje zadzwonić options.success, która nie istnieje! Stąd błąd.

+0

+1 dzięki za solucji. Właściwie teraz chciałbym napisać test (3), aby uruchomić go na kodzie (2). Czy masz pomysł, jak to zrobić? Zaktualizowałem moje pytanie. dzięki. –

+0

Wygląda na to, że wywołanie .success() będzie przestarzałe w jQuery 1.8. Sugeruję, że zamiast używać jaśminu, aby sfingować metodę ajaxową, patrzysz na sinon.js (http://sinonjs.org/), która faktycznie kpi z macierzystej XHR twojej przeglądarki. Działa świetnie dla mnie. – badunk

+0

Próbowałem 'stub jQuery.ajax', zobacz moje pytanie, kod (4). I dostaję i błąd, dlaczego? jaki przykład "sinonjs.org" powinienem dostać? –

1

Istnieje wtyczka jquery, która używa sinonjs z qunit i zapewnia znacznie łatwiejszy sposób pisania testów ajaxowych i uzyskania oczekiwanych rezultatów.

Spójrz na jqueryspy

Powiązane problemy