Testing Asynchronous Callbacks with Jasmine
I would recommend taking a look at the async section of the jasmine docs. So, with this information we can use a done
callback to wait for the execution to finish before testing anything, like this:
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();
});
});
});
JQuery Mobile
Updated on June 07, 2022Comments
-
JQuery Mobile almost 2 years
I'm using Jasmine 2.1. I am trying to use Jasmine 2.1 to test a module. One of my modules has a function that executes code asynchronously. I need to test the result of the function when the app is done executing. Is there a way to do this? Currently, my module looks like this:
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;
I am trying to test my Module with the following:
var MyModule= require('./myModule'); describe("My Module", function() { var myModule = new MyModule(); it('Execute', function() { myModule.execute(); expect(myModule.state).toBe('Executed'); }); });
Clearly, the test is not awaiting for the execution to occur. How do I test an asynchronous executed function via Jasmine? In addition, am I using the state variable properly? I get lost in the asynchronous stack and I'm unsure where I can use '
this
'. -
Vlas Bashynskyi over 8 yearsAre you sure that we can use
expect(...).toBe(...)
inside of the async callback? -
Frances McMullin over 8 yearsJust checked, yep, for Jasmine 2.1 it works fine. For jasmine before 2.0 the async support looks totally different though.
-
Hlung over 7 years@VlasBashynskyi yes, jasmine now has async support. It will wait until
done()
is called. (5 sec timeout by default)