HTML and CSS Reference
In-Depth Information
13.1.3 Testing Timers
JsTestDriver does not do asynchronous tests, so we need some other way of test-
ing use of timers. There is basically two ways of working with timers. The ob-
vious approach is stubbing them as we have done with
ajax.request
and
ajax.create
(or in a similar fashion). To stub them easily within tests, stub
the
window
object's
setTimeout
property, as seen in Listing 13.14.
Listing 13.14
Stubbing
setTimeout
(function () {
TestCase("ExampleTestCase", {
setUp: function () {
this.setTimeout = window.setTimeout;
},
tearDown: function () {
window.setTimeout = this.setTimeout;
},
"test timer example": function () {
window.setTimeout = stubFn();
// Setup test
assert(window.setTimeout.called);
}
});
}());
JsUnit, although not the most modern testing solution around (as discussed
in Chapter 3,
Tools of the Trade
), does bring with it a few gems. One of these is
jsUnitMockTimeout.js
, a simple library to aid testing of timers. Note that
although the file is named “mock,” the helpers it defines are more in line with what
we have been calling stubs.
jsUnitMockTimeout provides a
Clock
object and overrides the native
setTimeout
,
setInterval
,
clearTimeout
, and
clearInterval
func-
tions. When
Clock.tick(ms)
is called, any function scheduled to run sometime
within the next
ms
number of milliseconds will be called. This allows the test to
effectively fast-forward time and verify that certain functions were called when
scheduled to.
The nice thing about the JsUnit clock implementation is that it makes tests focus
more clearly on the expected behavior rather than the actual implementation—do
some work, pass some time, and assert that some functions were called. Contrast