准备条件
以第1节教程的创建的目录和代码为基础进行讲解。如果没有看过第1节教程,请关注我,查看以往该系列的文章
这节教程主要讲解在jest中的怎样去测试定时器,将第1节的代码复制一份,并且把index.js
和index.test.js
文件内容全部清空
下面将介绍3种测试定时器的方法
在 index.js
中写入一些待测试方法
export const timer1 = (callback) => {
setTimeout(() => {
callback()
}, 3000)
}
export const timer2 = (callback) => {
setTimeout(() => {
callback()
setTimeout(() => {
callback()
}, 3000)
}, 3000)
}
1.使用 done 方法
在 index.test.js
中写入测试用例
import { timer1, timer2 } from './index'
/**
* 通过 done 对定时器进行测试
*/
// it是test的别名
it('使用done,测试定时器', (done) => {
timer1(() => {
expect(1).toBe(1)
done()
})
})
这里有个问题,如果定时器时间很长的话,那测试用例运行的时间也会很长,因此不推荐这种写法
2.使用 useFakeTimers + runAllTimers 方法
/**
* 使用 useFakeTimers + runAllTimers 方法 对定时器timer1进行测试
*/
// it是test的别名
it('使用useFakeTimers + runAllTimers 方法,测试定时器timer1', () => {
const fn = jest.fn()
timer1(fn)
jest.runAllTimers()
expect(fn).toHaveBeenCalledTimes(1) // 测试函数调用次数
})
/**
* 使用 useFakeTimers + runAllTimers 方法 对定时器timer2进行测试
*/
// it是test的别名
it('使用useFakeTimers + runAllTimers 方法,测试定时器timer2', () => {
const fn = jest.fn()
timer2(fn)
// 测试次数
jest.runAllTimers()
expect(fn).toHaveBeenCalledTimes(2) // 测试函数调用次数
// 如果只想测试一次,可以使用以下方法
// jest.runOnlyPendingTimers()
// expect(fn).toHaveBeenCalledTimes(1)
})
这种方式不需要等待定时器全部完成,是我比较推荐的用法
- 使用
jest.useFakeTimers()
声明使用虚拟的时间 - 再使用
jest.runAllTimers()
将全部定时器立即运行结束 - 如果内部有多个定时器,只想运行一个定时器可以使用
jest.runOnlyPendingTimers()
3.使用 useFakeTimers + advanceTimersByTime 方法
import { timer1, timer2 } from './index'
// 声明使用虚假的时间
jest.useFakeTimers()
/**
* 使用 useFakeTimers + advanceTimersByTime 方法 对定时器timer2进行测试
*/
// it是test的别名
it('使用 useFakeTimers + advanceTimersByTime 方法,测试定时器timer2', () => {
const fn = jest.fn()
timer2(fn)
jest.advanceTimersByTime(3000) // 将时间立刻推后3000s
expect(fn).toHaveBeenCalledTimes(1)
jest.advanceTimersByTime(3000) // 将时间再立刻推后3000s
expect(fn).toHaveBeenCalledTimes(2)
})
- 使用
jest.advanceTimersByTime()
可以立即设置推后多少毫秒
以上就是测试定时器的3种方法,个人比较推荐第2种方法
下一节教程将介绍在jest中怎样进行快照测试
本人能力有限,文章可能会有不正确或者不恰当的部分,希望你可以指出