2014-12-07 19 views
6

Sto utilizzando Jasmine 2.1. Sto cercando di usare Jasmine 2.1 per testare un modulo. Uno dei miei moduli ha una funzione che esegue il codice in modo asincrono. Devo testare il risultato della funzione quando l'app è stata completata. C'è un modo per fare questo? Attualmente, il mio modulo è simile al seguente:Test callback asincroni con Jasmine

var otherModule = require('otherModule'); 
function MyModule() { 
} 

MyModule.prototype.state = ''; 
MyModule.prototype.execute = function(callback) { 
    try { 
    this.state = 'Executing'; 
    var m = new otherModule.Execute(function(err) { 
     if (err) { 
     this.state = 'Error'; 
     if (callback) { 
      callback(err); 
     } 
     } else { 
     this.state = 'Executed'; 
     if (callback) { 
      callback(null); 
     } 
     } 
    }); 
    } catch (ex) { 
    this.state = 'Exception'; 
    if (callback) { 
     callback(ex); 
    } 
    } 
}; 

module.exports = MyModule; 

sto cercando di testare il mio modulo con il seguente:

var MyModule= require('./myModule'); 
describe("My Module", function() { 
    var myModule = new MyModule(); 
    it('Execute', function() { 
    myModule.execute(); 
    expect(myModule.state).toBe('Executed'); 
    }); 
}); 

Chiaramente, il test non è in attesa per l'esecuzione a verificarsi. Come posso testare una funzione eseguita asincrona tramite Jasmine? Inoltre, sto usando la variabile di stato correttamente? Mi perdo nello stack asincrono e non sono sicuro di dove sia possibile usare "this".

risposta

8

Suggerirei di dare un'occhiata allo async section of the jasmine docs. Così, con queste informazioni siamo in grado di utilizzare un callback done di aspettare per l'esecuzione di finire prima di testare qualsiasi cosa, in questo modo:

var MyModule= require('./myModule'); 
describe("My Module", function() { 
    var myModule = new MyModule(); 
    it('Execute', function(done) { 
    myModule.execute(function(){ 
     expect(myModule.state).toBe('Executed'); 
     done(); 
    }); 
    }); 
}); 
+0

Sei sicuro che possiamo usare 'aspetta (...) Tobe (... .) 'all'interno del callback asincrono? –

+0

Appena controllato, sì, per Jasmine 2.1 funziona perfettamente. Per il gelsomino prima del 2.0 il supporto asincrono sembra totalmente diverso. –

+0

@VlasBashynskyi sì, il gelsomino ora ha il supporto asincrono. Attenderà fino a quando 'done()' viene chiamato. (5 secondi di timeout per impostazione predefinita) – Hlung

Problemi correlati