Domanda

Sto lottando per trovare eventuali esempi su come falsare una chiamata Ajax usando Jasmine BDD?

Ho una funzione Ajax personalizzata che funziona come così ...

ajax({
    url: 'JSON.php',
    dataType: 'json',           
    onSuccess: function(resp) {
        console.log(resp);
    }
});
.

... e non ho idea di come creare uno stub per chiamare finta la funzione Ajax effettiva.

Voglio evitare di chiamare la funzione Ajax in quanto potrebbe rallentare la mia suite di test se una chiamata Ajax reale al server richiede del tempo per rispondere e ho un sacco di specifiche nella mia suite di prova.

Ho sentito che puoi usare spyOn(namespace, 'ajax') ma è fastidioso subito come mi richiede di avvolgere la mia funzione ajax in un oggetto solo per utilizzare la funzione spyOn (ma a prescindere non sono riuscito a seguire T trova alcuni esempi specifici per falsificare una chiamata Ajax).

Ho anche sentito che puoi usare createSpy() ma ancora una volta la documentazione non è molto utile (né il corrispondente Wiki su GitHub).

Qualsiasi aiuto per spiegare come usare Spies per creare una chiamata falsa Ajax sarebbe molto apprezzata!

È stato utile?

Soluzione

Puoi utilizzare il framework di simulazione SinonJS, che ha una build nel server falso .Puoi usarlo facilmente con il gelsomino:

beforeEach(function() {
        server = sinon.fakeServer.create();
        server.respondWith([200, { "Content-Type": "text/html", "Content-Length": 2 }, "OK"])
});

Btw.se la tua funzione ajax è nello spazio dei nomi globale, perché non chiamare spyOn(window, 'ajax')

Altri suggerimenti

Per quanto riguarda una singola funzione, è possibile utilizzare 'CreateSpy':

/*var */ajax = createSpy('foo');
.

var è assente perché si desidera ridefinarlo, ma è quindi richiesto che il blocco in cui definisci questa spia sia associato allo stesso scopo in cui è stato definito il vero ajax.Oppure, se sei confuso con quello, utilizzare spyOn(window, foo), perché lo è comunque testato nel browser.

Vedi Questa risposta per i dettagli.

Per quanto riguarda la chiamata Ajax, vedere supporto asincrono sezione in nuovi documenti o meglio utilizzare Orologio :

window.ajax = function() {};

var response;

var ajaxSpy = spyOn(window, 'ajax').andCallFake(function(url, callback) {
   setTimeout(function() { callback({ 'foo': 'bar' }); }, 1000);
});

jasmine.Clock.useMock();

function callback(resp) { response = resp;  }

ajax('fake.url', callback);

jasmine.Clock.tick(1500);

expect(ajaxSpy).toHaveBeenCalled();
expect(response).toBeDefined();
expect(response.foo).toBeDefined();
.

Se ti va bene non usare le spie, ma invece il componente aggiuntivo jasmine-ajax.Per simulare una singola specifica, usa withMock:

  it("allows use in a single spec", function() {
    var onSuccess = jasmine.createSpy('success');
    jasmine.Ajax.withMock(function() {
      ajax({
            url: 'JSON.php',
            dataType: 'json',           
            onSuccess: onSuccess
      });
      expect(onSuccess).not.toHaveBeenCalled();

      jasmine.Ajax.requests.mostRecent().respondWith({
        "status": 200,
        "responseText": '{"some": "json"}'
      });

      expect(onSuccess).toHaveBeenCalledWith('{"some": "json"}');
    });
  });

La risposta viene inviata solo quando si utilizza respondWith.Il link sopra ha alcune indicazioni su come installare

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top