Testing setTimeout and setInterval with Jasmine

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();
});

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.

Henning Koch Almost 9 years ago