One of first things which I've found was Sinon.js - the mock library to make my life easier. Btw, I'm using Jasmine for writing tests. So, everything looks great until I've tried to integrate my tests into our CIA (Jenkins).
The tests which working great within browser failed using rhino/env.js. That was weird and unfortunately tracebacks were useless. I've started to go deeper and found an article which make things clear to me: Sinon.js have issues with timers.
Update: I've fixed issue with Sinon.JS Fake Timers and Rhino.js
I've made small stub to replace functionality of fake timeouts from Sinon.js and wow, tests are passed!
// setTimeout/clearTimeout stub using Underscore.js var FakeTimeout = function () { var self = this, timers = [], counter = 1, timeoutOrig = setTimeout, clearOrig = clearTimeout; // add new timeout to the queue this.setTimeout = function (f, timeout) { var id = counter++; timers.push({ 'callback': f, 'timeout': timeout, 'id': id }); return id; }; // cleanup timeout this.clearTimeout = function (id) { timers = _.filter(timers, function (item) { return item.id !== id; }); }; // tick the clock by timeout this.tick = function (timeout) { var timerToRemove = []; _.each(timers, function (timer) { if (timer.timeout - timeout <= 0) { timer.callback(); timerToRemove.push(timer); } else { timer.timeout = timer.timeout - timeout; } }); timers = _.difference(timers, timerToRemove); }; // install fake timers this.install = function () { setTimeout = _.bind(this.setTimeout, this); clearTimeout = _.bind(this.clearTimeout, this); }; // restore the original timers this.restore = function () { setTimeout = timeoutOrig; clearTimeout = clearOrig; }; };
Here is how to use it:
// Usage: var timeout = new FakeTimeout(); // Somewhere in your code timeout.install(); // ... some functionality which use setTimeout/clearTimeout timeout.tick(1000); // restore the state of setTimeout/clearTimeout timeout.restore()
The code require Underscore.js
The conclusion is to keep it simple. I don't get why you guys need so much code for such simple thing.