2013-05-15 9 views
9

che ho avuto nessun problema smistamento beffardo la condizione di successo, ma non riesco a capire come prendere in giro il/condizioni timeout guasto quando si utilizza Sinon e Qunit per testare e la funzione ajax:Come si simula una risposta "timeout" o "failure" utilizzando Sinon/Qunit?

Il mio set up è questo:

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

e la mia prova caso di successo, felicemente in esecuzione e la ricezione/passando attraverso i dati ricevuti al metodo di successo è questo:

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

Tuttavia, non riesco a capire che cosa dovrei mettendo al posto di questo:

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

per far sì che il mio gestore di chiamate ajax "senta" un metodo di errore o di timeout? L'unica cosa che potevo pensare era:

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

Ma non funziona.

Cosa sto sbagliando o cosa ho frainteso? Tutti gli aiuti molto apprezzati :)

+0

Il timeout è una mancanza di risposta in un dato momento, quindi non è possibile restituire un timeout –

+0

Speravo che il sinon potesse superarlo e fornire un'interfaccia standardizzata per tutti i tipi di risposta. Se non riesco a "restituire" un timeout usando sinon - allora come faccio a fingere uno? –

+0

Non so sinon quindi forse c'è qualcosa di specifico, ma normalmente si imposta il timeout per dire 1ms, e si usa aspettare sul lato server o mock-server. –

risposta

0

Per il timeout, il fake timers di sinon potrebbe essere d'aiuto. Usandoli non avresti bisogno di impostare il timeout su 1ms. Per quanto riguarda i fallimenti, il tuo approccio è looks correct per me. Puoi darci più codice, in particolare il gestore degli errori?

0

fare qualcosa di simile

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

lavora per far scattare il callback 'errore' nelle richieste jQuery AJAX.

Per quanto riguarda le timouts, è possibile utilizzare sinons orologio falso come questo:

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

Forse la strada da seguire per Ajax di jQuery, ma CJ stava chiedendo il falso XHR di sinon; nessuno di questi approcci funziona per sinon. –

-1

impostare un timeout sul $.ajax() chiamata e utilizzare Sinon fake timers per spostare l'orologio avanti prima di rispondere.

+0

CJ non sta effettuando una chiamata $ .ajax(), ma una chiamata XHR falsa sinon e sinon non supporta la proprietà .timeout. –

Problemi correlati