2014-12-07 2 views
6

Я использую Jasmine 2.1. Я пытаюсь использовать Jasmine 2.1 для тестирования модуля. Один из моих модулей имеет функцию, выполняющую асинхронный код. Мне нужно проверить результат функции, когда приложение выполнено. Есть ли способ сделать это? В настоящее время мой модуль выглядит следующим образом:Тестирование асинхронных обратных вызовов с жасмином

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; 

Я пытаюсь проверить мой модуль со следующим:

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

Очевидно, что тест не ожидает для выполнения произойти. Как проверить асинхронную выполняемую функцию через Jasmine? Кроме того, я использую переменную состояния правильно? Я теряюсь в асинхронном стеке, и я не уверен, где я могу использовать 'this'.

ответ

8

Я бы порекомендовал взглянуть на async section of the jasmine docs. Таким образом, с помощью этой информации можно использовать done обратный вызов, чтобы ждать выполнения, чтобы закончить перед тестированием что-нибудь, как это:

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

Вы уверены, что мы можем использовать 'ожидать (...) Тоба (... .) 'внутри асинхронного обратного вызова? –

+0

Только что проверил, да, для Jasmine 2.1 он отлично работает. Для жасмина до 2.0 асинхронная поддержка выглядит совершенно другой. –

+0

@ VlasBashynskyi да, жасмин теперь имеет асинхронную поддержку. Он будет ждать, пока вызывается 'done()'. (По умолчанию - 5 секунд) – Hlung

Смежные вопросы