计时器模拟
原生的计时器函数(如:setTimeout()
, setInterval()
, clearTimeout()
, clearInterval()
)并不是很方便测试,因为程序需要等待相应的延时。 Jest可以通过一个函数转换计时器以便允许你控制时间流量。 Great Scott!
信息
另请参阅假计时器 API 文档。
启用假计时器
在下面的例子中,我们通过调用 jest.useFakeTimers()
来启用假计时器。 这将取代 setTimeout()
和其他计时器函数的原始实现。 计时器可以恢复他们默认的行为通过jest.useRealTimers()
.
timerGame.js
function timerGame(callback) {
console.log('Ready....go!');
setTimeout(() => {
console.log("Time's up -- stop!");
callback && callback();
}, 1000);
}
module.exports = timerGame;
__tests__/timerGame-test.js
jest.useFakeTimers();
jest.spyOn(global, 'setTimeout');
test('waits 1 second before ending the game', () => {
const timerGame = require('../timerGame');
timerGame();
expect(setTimeout).toHaveBeenCalledTimes(1);
expect(setTimeout).toHaveBeenLastCalledWith(expect.any(Function), 1000);
});
运行所有计时器
对于这个模块我们还需要写一个测试,用于判断回调函数是否在1秒后被调用的。 为此,我们将使用Jest的定时器控制API,用于在测试中将时间“快进”到正确的时间点。
jest.useFakeTimers();
test('calls the callback after 1 second', () => {
const timerGame = require('../timerGame');
const callback = jest.fn();
timerGame(callback);
// At this point in time, the callback should not have been called yet
expect(callback).not.toHaveBeenCalled();
// Fast-forward until all timers have been executed
jest.runAllTimers();
// Now our callback should have been called!
expect(callback).toHaveBeenCalled();
expect(callback).toHaveBeenCalledTimes(1);
});