Testing Asynchronous Callbacks with Jasmine

15,984

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();
    });
  });
});
Share:
15,984
JQuery Mobile
Author by

JQuery Mobile

Updated on June 07, 2022

Comments

  • JQuery Mobile
    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
    Vlas Bashynskyi over 8 years
    Are you sure that we can use expect(...).toBe(...) inside of the async callback?
  • Frances McMullin
    Frances McMullin over 8 years
    Just checked, yep, for Jasmine 2.1 it works fine. For jasmine before 2.0 the async support looks totally different though.
  • Hlung
    Hlung over 7 years
    @VlasBashynskyi yes, jasmine now has async support. It will wait until done() is called. (5 sec timeout by default)