jasmine-stray-timers
v1.1.0
Published
Jasmine test helper for detecting setTimeout and setInterval usage outside of test boundaries
Downloads
70
Readme
jasmine-stray-timers
Jasmine test helper for detecting setTimeout
and setInterval
usage outside of test boundaries.
Requires
jasmine
.
Install
$ npm install --save-dev jasmine-stray-timers
Usage
In karma
:
// karma.conf.js
module.exports = function(config) {
config.set({
frameworks: ['jasmine'],
files: [
// ...,
require.resolve('jasmine-stray-timers'),
// ...
],
});
};
Ignoring stray timers in a test
Stray timers can be ignored in a single test or in a suite by calling this._ignoreStrayTimers
in the jasmine test context.
export function foo(a) {
setTimeout(function() {
// do something async
}, 100);
return a + 1;
}
describe('foo', function() {
it('bar', function() {
this._ignoreStrayTimers();
expect(bar()).toEqual(2);
});
});
Only print warning on stray timers in a test
Stray timers can be ignored, and an error can be printed in a single test or in a suite by calling this._onlyWarnOnStrayTimers
in the jasmine test context.
export function foo(a) {
setTimeout(function() {
// do something async
}, 100);
return a + 1;
}
describe('foo', function() {
it('bar', function() {
this._onlyWarnOnStrayTimers();
expect(bar()).toEqual(2);
});
});
Output
If test code executed a timer and didn't wait for it to resolve before ending the test, it will throw an error.
// src.js
export function foo(a) {
setTimeout(function() {
// do something async
}, 100);
return a + 1;
}
export function bar() {
return foo(1);
}
// test.js
import { bar } from './src';
describe('foo', function() {
it('bar', function() {
expect(bar()).toEqual(2);
});
});
PhantomJS 2.1.1 (Mac OS X 0.0.0) foo bar FAILED
Error: Stray "setTimeout" call was executed outside the test constraints (line 68)
localSetTimeout
foo
bar
loaded@http://localhost:9876/context.js:151:17
PhantomJS 2.1.1 (Mac OS X 0.0.0): Executed 1 of 1 (1 FAILED) (skipped 10) ERROR (0.005 secs / 0.001 secs)
Caveat
Due to the nature of how async javascript execution works, if a timer is set up within another async operation (eg. Promise
), this library
cannot reliably determine the exact test that triggered the timer.
In this case, the error will be triggered in an subsequent test in which the async operation resolved.
// src.js
export function foo(a) {
window.fetch('some url')
.then(function() {
setTimeout(function() {
// do something async
}, 100);
});
return a + 1;
}
// test.js
import './src';
describe('foo', function() {
it('test 1', function() {
expect(foo(1)).toEqual(2);
});
it('test 2', function() {
expect(2).toEqual(2);
});
});