2013-02-28 11 views
17

mi sto conosco Jasmine (http://pivotal.github.com/jasmine/) ed ha trovato qualcosa di sconcertante:jasmine.js si aspettano() non funziona all'interno di un callback asincrono

it("should be able to send a Ghost Request", function() { 
    var api = fm.api_wrapper; 

    api.sendGhostRequest(function(response) { 
    console.dir('server says: ', response); 
    }); 

    expect(true).toEqual(false); 
}); 

Non riesce come previsto.

Tuttavia, spostando la aspettano chiamare all'interno della callback:

it("should be able to send a Ghost Request", function() { 
    var api = fm.api_wrapper; 

    api.sendGhostRequest(function(response) { 
    console.dir('server says: ', response); 
    expect(true).toEqual(false); 
    }); 
}); 

passa qualche modo: O

Dopo debugging: api.sendGhostRequest() fa una richiesta asincrona ajax, e gelsomino precipita passato prima la richiesta è stata completata.

Di qui la domanda:

Come faccio ad avere il gelsomino di aspettare per l'esecuzione ajax prima di accertare il risultato del test?

+1

Con Jasmine 2.0 è appena lo chiamano ("disc", function (done) {... done(); ...}). Solo dicendo, perché questo thread è alto nei risultati di google :) – pkopac

risposta

12

Edit per Jasmine 2

test asincroni sono diventati molto più semplice in Jasmine 2. Qualsiasi test che deve gestire il codice asincrono può essere scritto con un callback che indicherà il completamento del test. Vedere la Jasmine 2 docs sotto il supporto intestazione Asynchronous

it('should be able to send a ghost request', (done) => { 
    api.sendGhostRequest((response) => { 
     console.log(`Server says ${response}`); 
     expect(true).toEqual(false); 
     done(); 
    }); 
}); 

Jasmine 1

Date un'occhiata al waitsFor() e piste() sul Jasmine site sotto l'intestazione asincrona Supporto .

L'uso di corse e attese dovrebbe costringere Jasmine ad aspettare che la chiamata ajax termini o per un certo periodo di tempo.

Il codice sarà simile:

it("should be able to send a Ghost Request", function() { 
    runs(function() { 
     api.sendGhostRequest(function(response) { 
      console.dir('server says: ', response); 
      flag = true; 
     }); 
    }, 500); 

    waitsFor(function() { 
     return flag; 
    }, "Flag should be set", 750); 

    runs(function() { 
     expect(true).toEqual(false); 
    }); 
} 

In tal caso l'aspettano fallirebbe.

+0

Cheers!Mi sento imbarazzato, come se fossi appena stato RTFM :) Funziona come un fascino :) –

+0

Qual è il '500' alla fine delle prime esecuzioni()? – zkent

+0

Il 500 sulle prime esecuzioni è un timeout per l'azione asincrona. In alternativa, è possibile aggiungere un setTimeout dopo la chiamata api.sendGhostRequest per fornire un caso alternativo da eseguire al timeout. Ad esempio: setTimeout (function() { flag = true; }, 500); – halfs13

1

Guardare in corse() e waitfor()

In particolare è possibile chiamare waitfor per verificare che il callback ha eseguito in qualche modo (magari usando un valore booleano come un controllo?) E quindi eseguire il aspetta dopo.

consente di attendere fino a quando l'waitfor non è stato completato.

async jasmine documentation

+0

Grazie! Avrei dovuto leggere il manuale .. –

4

Come @pkopac commentato, runs() e waitsFor() sono stati deprecati in v2 favore di utilizzare un callback done() come documentato: https://jasmine.github.io/2.0/introduction.html#section-Asynchronous_Support

it("should be able to send a Ghost Request", function(done) { 
    var api = fm.api_wrapper; 

    var success = function(response) { 
     console.dir('server says: ', response); 
     expect(response).toEqual('test response') 
     done(); 
    }; 

    api.sendGhostRequest(success); 
}); 
+0

'done' dovrebbe essere nel parametro funzione da usare. ("dovrebbe essere in grado di inviare una richiesta Ghost", function (done) {' –

+0

good catch! thanks @Chase Choi! – ptim

+0

Come aspettare che una condizione diventi vera nelle specifiche? ovvero cosa faccio se voglio aspettare che la mia app funzioni, ma non ho un callback "di successo"? Devo scrivere il mio ciclo di attesa "waitFor"? – Rich

Problemi correlati