2013-05-15 28 views
9

miałem żadnych problemów sortowaniu szyderczy warunek sukcesu, ale nie wydaje się pojąć, jak wyśmiewać awaria/warunki limitu czasu podczas korzystania sinon i Qunit przetestować i funkcji ajax:Jak wyśmiać odpowiedź "timeout" lub "failure" za pomocą Sinon/Qunit?

Mój set up to:

$(document).ready(function() { 

    module("myTests", { 
     setup: function() { 
      xhr = sinon.sandbox.useFakeXMLHttpRequest(); 
      xhr.requests = []; 
      xhr.onCreate = function (request) { 
       xhr.requests.push(request); 
      }; 

      myObj = new MyObj("#elemSelector"); 
     }, 
     teardown: function() { 
      myObj.destroy(); 
      xhr.restore(); 
     } 
    }); 

i moja próba sprawa sukces, działa szczęśliwie i odbierania/przejazdem odebranych danych do metody sukcesu jest to:

test("The data fetch method reacts correctly to receiving data", function() { 
     sinon.spy(MyObject.prototype, "ajaxSuccess"); 

     MyObject.prototype.fetchData(); 

     //check a call got heard 
     equal(1, xhr.requests.length); 

     //return a success method for that obj 
     xhr.requests[0].respond(200, { "Content-Type": "application/json" }, 
       '[{ "responseData": "some test data" }]'); 

     //check the correct success method was called 
     ok(MyObj.prototype.ajaxSuccess.calledOnce); 

     MyObj.prototype.ajaxSuccess.restore(); 
    }); 

jednak nie mogę pracować poza to, co powinno być wprowadzenie zamiast to:

 xhr.requests[0].respond(200, { "Content-Type": "application/json" }, 
       '[{ "responseData": "some test data" }]'); 

, aby mój moduł obsługi wywołania ajax "usłyszeć" błąd lub metodę Timeout? Mogłem tylko spróbować:

 xhr.requests[0].respond(408); 

Ale to nie działa.

Co robię źle lub co źle zrozumiałem? Cała pomoc doceniona :)

+0

Limit czasu jest brakiem odpowiedzi w danym czasie, więc nie można zwrócić limitu czasu. –

+0

Miałem nadzieję, że sinon może przezwyciężyć to i dać ustandaryzowany interfejs dla wszystkich rodzajów reakcji. Jeśli nie mogę "przywrócić" limitu czasu przy użyciu sinona - to jak mam go sfałszować? –

+0

Nie znam sinona, więc może jest coś konkretnego, ale zwykle ustawiasz limit czasu na mówienie 1ms i używasz oczekiwania na serwerze lub stronie serwera próbnego. –

Odpowiedz

0

W przypadku przekroczenia limitu czasu pomocna może być wersja fake timers. Korzystanie z nich nie będzie wymagało ustawienia limitu czasu na 1ms. Jeśli chodzi o niepowodzenia, twoje podejście looks correct do mnie. Czy możesz dać nam więcej kodu, szczególnie obsługi niepowodzeń?

0

Robi coś takiego

requests[0].respond(
     404, 
     { 
      'Content-Type': 'text/plain', 
      'Content-Length': 14 
     }, 
     'File not found' 
); 

działa wyzwolić 'Błąd' zwrotnego w jQuery żądania AJAX.

chodzi o timouts, można użyć sinons fałszywe zegar tak:

test('timeout-test', function() { 
    var clock = sinon.useFakeTimers(); 
    var errorCallback = sinon.spy(); 

    jQuery.ajax({ 
     url: '/foobar.php', 
     data: 'some data', 
     error: errorCallback, 
     timeout: 20000 // 20 seconds 
    }); 

    // Advance 19 seconds in time 
    clock.tick(19000); 

    strictEqual(errorCallback.callCount, 0, 'error callback was not called before timeout'); 

    // Advance another 2 seconds in time 
    clock.tick(2000); 

    strictEqual(errorCallback.callCount, 1, 'error callback was called once after timeout'); 
}); 
+1

Być może sposób, aby przejść do Ajax jQuery, ale CJ pytał o fałszywe XHR sinona; żadne z tych podejść nie działa dla grzechu. –

-1

Ustaw limit czasu na rozmowy $.ajax() i używać sinon fake timers przenieść zegar na przodzie przed udzieleniem odpowiedzi.

+0

CJ nie wykonuje wywołania $ .ajax(), ale fałszywe wywołanie XHR i sinon nie obsługuje właściwości .timeout. –