2009-02-06 3 views

risposta

49

Per beffardo richieste Ajax, si può provare qualcosa di simile ...

Ecco la funzione che si desidera prova:

var functionToTest = function() { 
     $.ajax({ 
      url: 'someUrl', 
      type: 'POST', 
      dataType: 'json', 
      data: 'foo=1&foo=2&foo=3', 
      success: function (data) { 
       $('#main').html(data.someProp); 
      } 
     }); 
    }; 

Ecco il banco di prova:

test('ajax mock test', function() { 
     var options = null; 
     jQuery.ajax = function (param) { 
      options = param; 
     }; 
     functionToTest(); 
     options.success({ 
      someProp: 'bar' 
     }); 
     same(options.data, 'foo=1&foo=2&foo=3'); 
     same($('#main').html(), 'bar'); 
    }); 

Si tratta essenzialmente di ignorare la funzione ajax di jQuery e quindi controlla quanto segue 2 cose: - il valore che è stato passato alla funzione ajax - richiama il callback successo e afferma che ha fatto quello che doveva fare

+4

mi ci sono voluti circa mezz'ora per arrivare alla funzione (param) {opzioni = param;}, ma poi mi ha colpito .. . Veramente cool. –

+0

Bello. Veramente bello. – StuperUser

+0

Se stavate testando le chiamate annidate, queste opzioni sarebbero meglio conservate in un array e per ogni chiamata a .push() gli oggetti options a quell'array? – StuperUser

5

ho appena iniziato a utilizzare Sinon.JS, che permette beffardo di XMLHttpRequests e offre anche una semplice API finto-server. Davvero facile da usare! Offre anche l'integrazione con qunit.

15

Invece di eseguire l'override della funzione AJAX di jQuery, è possibile utilizzare anche il plugin jQuery Mockjax sviluppato da .appendTo. Questo plugin fa essenzialmente ciò che l'altra risposta suggerisce, ma consente un beffardo molto più sofisticato. Ad esempio, se avete la funzione di:

$.ajax({ 
    url:"/api/user", 
    type:"GET", 
    dataType:"json", 
    data:'{"uid":"foobar"}', 
    success:function(data){ 
     console.log("Success!"); 
    }, 
    error:function(data){ 
     console.log("Error!"); 
    } 
}); 

Puoi prendere in giro con mockjax semplicemente chiamando la funzione mockjax, che è incluso automaticamente in jQuery:

$.mockjax({ 
    url:"/api/user", 
    type:"GET", 
    response:function(requestData){ 
     //handle the mock response in here 
     this.responseText = '{"fullname":"Mr. Foo Bar"}'; 
    } 
}); 

La seconda funzione beffardo può essere incluso in un file JavaScript esterno, dite "mocks.js" e l'unica altra cosa che deve essere fatta è includere la libreria mockjax (che può essere trovata in https://github.com/appendto/jquery-mockjax/). L'unica cosa da tenere a mente è che questo simula solo le chiamate jQuery ajax, non tutte le XMLHttpRequests. Se vuoi farlo, segui i consigli di @ bertvh e usa Sinon.js.

+1

+1 all'utilizzo di mockjax. Ho appena iniziato a usarlo ed è abbastanza buono per i test unitari e per i dati fittizi per lo sviluppo dello schermo. L'unico problema che ho avuto è stato che i file di dati JSON venivano memorizzati nella cache dal browser Chrome. Cancellare la cache ha risolto eventuali problemi di file obsoleti. – Evildonald