How jasmine clock works?

15,954

The install() function actually replaces setTimeout with a mock function that jasmine gives you more control over. This makes it synchronous, because no actual waiting is done. Instead, you manually move it forward with the tick() function, which is also synchronous.

See the source code: https://github.com/jasmine/jasmine/blob/ce9600a3f63f68fb75447eb10d62fe07da83d04d/src/core/Clock.js#L21

Suppose you had a function that internally set a timeout of 5 hours. Jasmine just replaces that setTimeout call so that the callback will be called when you call tick() so that the internal counter reaches or exceeds the 5 hour mark. It's quite simple!

Share:
15,954

Related videos on Youtube

inf3rno
Author by

inf3rno

I am a Master of Science in Biochemical Engineering since 2011. My favorite topics are immunology, human physiology and dietetics. My other loves are software engineering, robotics and automation of experiments.

Updated on December 24, 2020

Comments

  • inf3rno
    inf3rno over 3 years

    I don't want to read code for hours to find the relevant part, but I am curious how jasmine implements its clock. The interesting thing with it is that it can test async code with sync testing code. AFAIK, with the current node.js, which supports ES5, this is not possible (async functions are defined in ES7). Does it parse the js code with something like estraverse and build an async test from the sync one?

    Just an example of what I am talking about:

    it("can test async code with sync testing code", function () {
        jasmine.clock().install();
    
        var i = 0;
        var asyncIncrease = function () {
            setTimeout(function () {
                ++i;
            }, 1);
        };
    
        expect(i).toBe(0);
        asyncIncrease();
        expect(i).toBe(0);
        jasmine.clock().tick(2);
        expect(i).toBe(1);
    
        jasmine.clock().uninstall();
    });
    

    In here the expect(i).toBe(1); should be in a callback.

  • inf3rno
    inf3rno over 9 years
    So this won't work by real async code, e.g. by db connection?
  • m59
    m59 over 9 years
    @inf3rno For ajax stuff, you'd either want to mock the ajax call (assume the server works) or for integration tests, actually let it be async.
  • inf3rno
    inf3rno over 9 years
    Ok. I'm working on an async framework for ES5, that's why I asked. Thanks! :-)
  • user2602152
    user2602152 over 8 years
    So all the timeouts that are set while the Jasmine clock is installed, will be removed when the clock is uninstalled? They will not start running again after you uninstall it?
  • apple16
    apple16 about 8 years
  • Alfonso Nishikawa
    Alfonso Nishikawa about 8 years
    Actually is not "quite simple". What a hack! Thanks for the explanation :) You made it at least "simpler" ;)