2014-12-07 14 views
6

Używam Jasmine 2.1. Próbuję użyć Jasmine 2.1, aby przetestować moduł. Jeden z moich modułów ma funkcję, która wykonuje asynchronicznie kod. Muszę przetestować wynik działania, gdy aplikacja zostanie wykonana. Czy jest jakiś sposób na zrobienie tego? Obecnie mój moduł wygląda następująco:Testowanie asynchronicznych wywołań zwrotnych za pomocą 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; 

Próbuję przetestować moduł z następujących czynności:

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

Oczywiste jest, że test nie jest w oczekiwaniu na wystąpienie wykonanie. Jak przetestować wykonaną asynchroniczną funkcję za pomocą Jasmine? Ponadto, czy poprawnie używam zmiennej stanu? Zgubiłem się w asynchronicznym stosie i nie jestem pewien, gdzie mogę użyć "this".

Odpowiedz

8

Polecam rzucić okiem na async section of the jasmine docs. Tak, z tych informacji możemy użyć done zwrotnego czekać na wykonanie zakończyć przed badaniem nic tak:

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

Czy jesteś pewien, że możemy użyć 'oczekiwać (...) Tobe (... .) 'wewnątrz asynchronicznego wywołania zwrotnego? –

+0

Właśnie sprawdziłem, tak, dla Jasmine 2.1 to działa dobrze. Dla jaśminu przed 2.0 asynchroniczne wsparcie wygląda zupełnie inaczej. –

+0

@VlasBashynskyi tak, jaśmin ma teraz asynchroniczne wsparcie. Będzie czekać, aż zostanie wywołane 'done()'. (Domyślnie 5-sekundowy limit czasu) – Hlung

Powiązane problemy