2013-05-06 29 views
18

Uso le esecuzioni di jasmine e aspetto di testare le operazioni asincrone. Tutto funziona bene ma non sono abbastanza sicuro di cosa succede dietro le quinte.Cosa fa il gelsomino e aspetta?

La documentazione del gelsomino riporta il seguente esempio a cui ho aggiunto tre istruzioni del registro.

describe("Asynchronous specs", function() { 
    var value, flag; 

    it("should support async execution of test preparation and exepectations", function() { 

    runs(function() { 
     flag = false; 
     value = 0; 

     setTimeout(function() { 
     flag = true; 
     }, 500); 
    }); 

    waitsFor(function() { 
     value++; 
     if(flag) { 
      console.log("A"); 
     } 
     return flag; 
    }, "The Value should be incremented", 750); 

    console.log("B"); 

    runs(function() { 
     console.log("C"); 
     expect(value).toBeGreaterThan(0); 
    }); 
    }); 
}); 

});

I primi runs e waitsFor sono perfettamente chiari per me. Runs avvia un'operazione asincrona e waitsFor attende una condizione.

Tuttavia, non capisco perché il secondo runs non si avvia fino al termine del waitsFor. waitsFor non è una chiamata di blocco.

La mia ipotesi è che waitsFor blocchi implicitamente qualsiasi successiva chiamata runs finché non è terminata. È così?

La mia prova è che il bilancio d'console.log uscita:

BAC

Ma se waitsFor sarebbe davvero bloccare dovrebbe essere

ABC

risposta

17

waitsFor non blocco fino a quando le condizioni lo sta aspettando perché sono incontrati o è scaduto.

Da jasmine docs: "waitsFor() fornisce un'interfaccia migliore per mettere in pausa le proprie specifiche fino al completamento di altri lavori.

I documenti collegati hanno anche un esempio leggermente più chiaro o waitsFor.

EDIT: Ah capisco cosa intendi ora. waitsFor non bloccherà JS non incluso in runs, waitsFor, ecc.

Ciò che sta facendo il gelsomino è il passaggio della funzione tramite runs o waitsFor e se il gelsomino non è attualmente in attesa, esegue immediatamente la funzione. Se è in attesa, non lo chiama finché non ha finito di aspettare.

Ciò non ferma il console.log dato che è stato passato al gelsomino in modo che il gelsomino non possa impedirne l'esecuzione immediata.

+0

Sono abbastanza sicuro che questo non è il caso. Metti un'istruzione tra 'waitsFor' e la seconda' run' verrà eseguita prima del codice in 'waitsFor', aggiornerò la mia domanda per riflettere questo. –

+0

Ma grazie per il link alla documentazione, non lo sapevo :) –

+0

E grazie ancora, la risposta è nei documenti, ma non proprio dove hai indicato :) –

4

La soluzione è nella documentazione:

più esecuzioni() blocchi in una specifica verrà eseguito in modo seriale. (Jasmine Documentation)

2

Dal sito: http://www.htmlgoodies.com/beyond/javascript/test-asynchronous-methods-using-the-jasmine-runs-and-waitfor-methods.html#fbid=mzNDUVfhFXg

Jasmine chiamerà le piste() e metodi waitsFor() nell'ordine in cui loro passato.Non appena il parser JS raggiunge un metodo waitsFor(), lo eseguirà il polling fino a quando non ritorna vero e solo allora continuerà su il prossimo metodo runs().

In sostanza, le funzioni runs() e waitsFor() riempiono un array con le funzioni fornite. La matrice viene quindi elaborata da jamine in cui le funzioni vengono richiamate in modo sequenziale. Si presume che le funzioni registrate da runs() eseguano il lavoro effettivo mentre quelle registrate da waitsFor() dovrebbero essere funzioni "latch" e verranno interrogate (invocate) ogni 10 ms finché non restituiscono true o scade il periodo di timeout registrato facoltativo. Se il periodo di timeout scade, viene segnalato un errore utilizzando il messaggio di errore registrato opzionale; in caso contrario, il processo continua con la funzione successiva nell'array. Presumibilmente, si aspetta che all'interno delle runs() possa anche attivare un report di errore (e forse anche nelle stesse funzioni di latch).

La documentazione è particolarmente ottusa su queste funzionalità asincrone.

+1

Jasmine 1.3 fornisce i wafer per i metodi (non attendereFor) la risposta dovrebbe essere corretta. – florianb