2012-01-17 13 views
11

Come posso testare onreadystatechange su XMLHttpRequest o puro Javascript AJAX senza jQuery? Lo sto facendo perché sto sviluppando l'estensione per Firefox. Credo di dover usare spie, ma non riesco a capire come, perché il mio ajax non restituirà nulla.Come testare XMLHttpRequest con Jasmine

 

    submit : function() { 
     var url = window.arguments[0]; 
     var request = new XMLHttpRequest(); 
     request.open("POST", 'http://'+this.host+'/doSomething', true); 
     request.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
     request.send("param="+param+"&emotions="+this.getParams()); 
     request.onreadystatechange = function() { 
      if(this.readyState == 4) { 
       // alert(this.responseText); 
      } 
     }; 

    } 
 
+0

possibile duplicato di [Come creare Stub per una funzione jax utilizzando Jasmine BDD] (http://stackoverflow.com/questions/8884060/how-to-create-stub-for-ajax-function-using-jasmine-bdd) –

+1

Bene, quello sta usando jQuery, ma sto cercando di usare XMLHttpRequest puro. – toy

+0

Certo, ma la risposta (usando il sinottico di SininJS) funziona anche per il tuo caso. –

risposta

-1

Come per il facsimile del codice qui sotto è probabile che sia possibile iniettare console.log() con il codice di stato e il testo di stato.

Ciò consente di identificare eventuali errori http. Speculativamente Direi che lo stato tornerà 404.

submit : function() { 
    var url = window.arguments[0]; 
    var request = new XMLHttpRequest(); 
    request.open("POST", 'http://'+this.host+'/doSomething', true); 
    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    request.send("param="+param+"&emotions="+this.getParams()); 
    request.onreadystatechange = function() { 
     console.log(this.status+ " - "+ this.statusText); 
    }; 

} 

Un'alternativa a questo potrebbe essere quella di guardare la richiesta di intestazione/risposta all'interno della console di Firebug. Il che è un buon punto: se non si utilizzano gli strumenti firebug o chrome dev, è necessario modificare la chiamata a console.log() a qualcosa che aggiunge la stringa a un oggetto documento non utilizzare utilizzando una chiamata di avviso().

How do I verify jQuery AJAX events with Jasmine?. Una risposta simile che implementa Jasmine.

+0

Hmm, potresti mostrarmi il codice anche da Jasmine per favore? – toy

+0

Non ho familiarità con Jasmine, tuttavia ho aggiunto un collegamento alla mia risposta che punta a una risposta da un thread simile che sembra essere il test Jasmine che stai cercando. – CBusBus

29

E che dire di questo?

beforeEach(function() { 
    // spyOn(XMLHttpRequest.prototype, 'open').andCallThrough(); // Jasmine 1.x 
    spyOn(XMLHttpRequest.prototype, 'open').and.callThrough(); // Jasmine 2.x 
    spyOn(XMLHttpRequest.prototype, 'send'); 
}); 

... 

it("should call proper YQL! API", function() { 
    podcast.load_feed('http://www.faif.us/feeds/cast-ogg/'); 

    expect(XMLHttpRequest.prototype.open).toHaveBeenCalled(); 
}); 

Pure Jasmine senza necessità di utilizzare alcuna libreria esterna.

+1

Questo ha funzionato per me. Ma come emulare i gestori di risposta xhr come onError, onLoad ecc.? – sonam

2

È possibile verificare in maniera tale

it("should make XHR request", function() { 

    // arrange 

    var xhr = { 
     open: jasmine.createSpy('open') 
    }; 

    XMLHttpRequest = jasmine.createSpy('XMLHttpRequest'); 
    XMLHttpRequest.and.callFake(function() { 
     return xhr; 
    }); 

    // act 

    submit(); 

    // assert 

    expect(xhr.open).toHaveBeenCalled(); 
}); 
0

Fornito da jasmine-ajax. Per prendere in giro per un uso singolo spec withMock:

it("allows use in a single spec", function() { 
    var doneFn = jasmine.createSpy('success'); 
    jasmine.Ajax.withMock(function() { 
     var xhr = new XMLHttpRequest(); 
     xhr.onreadystatechange = function(args) { 
     if (this.readyState == this.DONE) { 
      doneFn(this.responseText); 
     } 
     }; 

     xhr.open("GET", "/some/cool/url"); 
     xhr.send(); 

     expect(doneFn).not.toHaveBeenCalled(); 

     jasmine.Ajax.requests.mostRecent().respondWith({ 
     "status": 200, 
     "responseText": 'in spec response' 
     }); 

     expect(doneFn).toHaveBeenCalledWith('in spec response'); 
    }); 
    }); 

La risposta viene inviato solo quando si utilizza respondWith. Solo download the file e aggiungi come src al numero SpecRunner.html. Esempio di utilizzo allo https://github.com/serv-inc/JSGuardian (consultare la cartella di test).

Problemi correlati