2013-05-15 5 views
9

Ich habe keine Probleme hatte Aussortieren den Erfolg Zustand spöttisch, aber kann nicht scheinen, zu ergründen, wie die Ausfall/timeout Bedingungen spotten, wenn Sinon und QUnit mit der Funktion zu testen und Ajax:Wie spotze ich eine 'Timeout' oder 'Fehler' Antwort mit Sinon/Qunit?

Mein Set up ist dies:

glücklich und empfangen/die durch die empfangenen Daten an den Erfolg Methode
$(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(); 
     } 
    }); 

und mein Erfolg Fall Test läuft, ist dies:

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

Allerdings habe ich nicht herausfinden können, was soll ich stattdessen setzen von dies:

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

, damit mein Ajax-Call-Handler eine Fehler- oder Timeout-Methode "hört"? Das einzige, was ich denken könnte zu versuchen, war dies:

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

Aber es funktioniert nicht.

Was mache ich falsch oder was habe ich falsch verstanden? Alle Hilfe sehr geschätzt :)

+0

Timeout ist ein Mangel an Antwort in gegebener Zeit, so dass Sie keine Zeitüberschreitung zurückgeben können –

+0

Ich hoffte, Sinon könnte dies überwinden und eine standardisierte Schnittstelle für alle Arten von Antwort geben. Wenn ich eine Auszeit nicht mit Sinon "zurückgeben" kann - wie mache ich dann eine falsche? –

+0

Ich weiß nicht, Sinon so vielleicht gibt es etwas Spezifisches, aber normalerweise setzen Sie die Zeitüberschreitung um 1ms zu sagen, und verwenden Sie warten auf Server oder Mock-Server-Seite. –

Antwort

0

Für die Zeitüberschreitung könnte Sinons fake timers helfen. Mit ihnen müssten Sie das Timeout nicht auf 1 ms setzen. Wie für die Fehler, Ihr Ansatz looks correct zu mir. Können Sie uns mehr Code geben, insbesondere den Fehlerbehandler?

0

tun so etwas wie dieses

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

arbeitet die 'Fehler' Rückruf in jQuery AJAX Anfragen auszulösen.

Was die timouts, können Sie sinons gefälschte Uhr wird wie folgt verwendet werden:

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

Vielleicht der Weg für jQuerys Ajax, aber CJ fragte nach Sinons gefälschtem XHR; keiner dieser Ansätze funktioniert für sinon. –

-1

einen Timeout-Set auf Ihrem $.ajax() Anruf und verwenden Sinon fake timers die Uhr vor zu bewegen, bevor Sie reagieren.

+0

CJ macht keinen Aufruf von $ .ajax(), aber ein falscher XHR-Aufruf von Sinon und Sinon unterstützt die Eigenschaft .timeout nicht. –

Verwandte Themen