You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Jest测试JavaScript实现的sleep延迟函数?

测试方案

你当前编写的测试存在两个明显问题:一是无法验证sleep函数的延迟时长是否符合传入的参数要求,二是会真实等待指定的毫秒数,严重拖慢测试执行效率。推荐使用Jest内置的假定时器能力来模拟时间流逝,高效完成测试。

基础测试用例(验证核心逻辑)

test('sleep 函数在指定毫秒数后正常 resolve', async () => {
  // 启用假定时器,替换全局 setTimeout 实现
  jest.useFakeTimers()
  const testDelay = 2000

  // 调用sleep函数,暂不等待执行完成
  const sleepPromise = sleep(testDelay)

  // 验证setTimeout被正确调用,参数符合预期
  expect(setTimeout).toHaveBeenCalledTimes(1)
  expect(setTimeout).toHaveBeenLastCalledWith(expect.any(Function), testDelay)

  // 快进所有定时器,触发回调执行
  jest.runAllTimers()

  // 等待Promise状态变更,确认正常resolve
  await sleepPromise

  // 测试完成后恢复真实定时器,避免影响其他用例
  jest.useRealTimers()
})

进阶测试用例(验证不会提前触发)

如果需要更严谨地验证sleep不会早于指定时间resolve,可以用以下写法:

test('sleep 函数不会早于指定时长 resolve', async () => {
  jest.useFakeTimers()
  const testDelay = 2000
  const sleepPromise = sleep(testDelay)

  // 快进1999毫秒,未到指定延迟时间
  jest.advanceTimersByTime(1999)
  
  // 验证此时sleep的Promise仍处于pending状态
  const status = await Promise.race([
    sleepPromise.then(() => 'resolved'),
    Promise.resolve('pending')
  ])
  expect(status).toBe('pending')

  // 再快进1毫秒,到达指定时间,验证正常resolve
  jest.advanceTimersByTime(1)
  await expect(sleepPromise).resolves.toBeUndefined()

  jest.useRealTimers()
})

内容的提问来源于stack exchange,提问作者Asking

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 06:15:03