Mock the window.setTimeout in a Jasmine test to avoid waiting

Posted by Aligned on Geeks with Blogs See other posts from Geeks with Blogs or by Aligned
Published on Thu, 21 Aug 2014 06:32:06 GMT Indexed on 2014/08/21 22:21 UTC
Read the original article Hit count: 278

Originally posted on: http://geekswithblogs.net/Aligned/archive/2014/08/21/mock-the-window.settimeout-in-a-jasmine-test-to-avoid-waiting.aspx

Jasmine has a clock mocking feature, but I was unable to make it work in a function that I’m calling and want to test. The example only shows using clock for a setTimeout in the spec tests and I couldn’t find a good example. Here is my current and slightly limited approach.

 

If we have a method we want to test:

var test = function(){
        var self = this;
        self.timeoutWasCalled = false;
        self.testWithTimeout = function(){
           window.setTimeout(function(){
             self.timeoutWasCalled = true;
           }, 6000);
        };
};

Here’s my testing code:

var realWindowSetTimeout = window.setTimeout;
describe('test a method that uses setTimeout', function(){
    var testObject;
    beforeEach(function () {
        // force setTimeout to be called right away, no matter what time they specify
        jasmine.getGlobal().setTimeout = function (funcToCall, millis) {
            funcToCall();
        };
        testObject = new test();
    });
    afterEach(function() {
        jasmine.getGlobal().setTimeout = realWindowSetTimeout;
    });
    it('should call the method right away', function(){
       testObject.testWithTimeout();
       expect(testObject.timeoutWasCalled).toBeTruthy();
    });
});

I got a good pointer from Andreas in this StackOverflow question.

This would also work for window.setInterval.

Other possible approaches:

  • create a wrapper module of setTimeout and setInterval methods that can be mocked. This can be mocked with RequireJS or passed into the constructor.
  • pass the window.setTimeout function into the method (this could get messy)

© Geeks with Blogs or respective owner

Related posts about Unit Testing

Related posts about JavaScript