Read more

Testing setTimeout and setInterval with Jasmine

Avatar
Henning Koch
April 29, 2015Software engineer at makandra GmbH

Jasmine has a jasmine.clock() helper Archive that you can use to travel through time and trigger setTimeout and setInterval callbacks:

beforeEach(function() {
  timerCallback = jasmine.createSpy("timerCallback");
  jasmine.clock().install();
});

afterEach(function() {
  jasmine.clock().uninstall();
});

it("causes a timeout to be called", function() {
  setTimeout(function() {
    timerCallback();
  }, 100);

  expect(timerCallback).not.toHaveBeenCalled();

  jasmine.clock().tick(101);

  expect(timerCallback).toHaveBeenCalled();
});
Illustration web development

Do you need DevOps-experts?

Your development team has a full backlog? No time for infrastructure architecture? Our DevOps team is ready to support you!

  • We build reliable cloud solutions with Infrastructure as code
  • We are experts in security, Linux and databases
  • We support your dev team to perform
Read more

If you actually want the test to wait out the timer, your example function needs to accept a done argument, which you then call when the test is expected to finish:

it("causes a timeout to be called", function(done) {
  setTimeout(function() {
    timerCallback();
  }, 100);
  setTimeout(function() {
    expect(timerCallback).toHaveBeenCalled();
    done();
  }, 101);
});

Needless to say the second test is much slower than the first test.

Posted by Henning Koch to makandra dev (2015-04-29 16:04)