Read more

Testing setTimeout and setInterval with Jasmine

Henning Koch
April 29, 2015Software engineer at makandra GmbH

Jasmine has a jasmine.clock() helper Show archive.org snapshot 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 online protection

Rails Long Term Support

Rails LTS provides security patches for old versions of Ruby on Rails (2.3, 3.2, 4.2 and 5.2)

  • Prevents you from data breaches and liability risks
  • Upgrade at your own pace
  • Works with modern Rubies
Read more Show archive.org snapshot

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)