前端自动化测试jest教程7-定时器测试

2,507 阅读2分钟

准备条件

以第1节教程的创建的目录和代码为基础进行讲解。如果没有看过第1节教程,请关注我,查看以往该系列的文章

这节教程主要讲解在jest中的怎样去测试定时器,将第1节的代码复制一份,并且把index.jsindex.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中怎样进行快照测试

本人能力有限,文章可能会有不正确或者不恰当的部分,希望你可以指出

关注公众号,和我一起学习前端必备技能,前端自动化测试jest