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

Supertest + Express 配置运行Jest测试出现超时错误如何解决

问题根因
  • 你在async格式的测试用例中同时声明了done回调参数,但全程没有调用done()方法。Jest检测到测试函数传入了done参数时,会一直等待done()被主动调用才会判定测试结束,你没有调用该方法的情况下,无论设置多长的超时时间都会最终触发超时报错。
  • 你的断言逻辑存在错误:接口实际返回的状态码是200,但代码里写的是expect(response.status).toBe(201),断言不通过会直接抛出异常,中断代码执行,进一步导致done()永远不会被调用。
修复方案

你可以任选以下任意一种方式修复问题:

方案一:移除done参数,完全使用async/await逻辑

直接删除测试函数入参的done即可,Jest会自动等待async函数执行完成判定测试结束,修复后的代码示例:

it('responds with json', async function() {
  const response = await request(app)
    .get('/user')
  // 同步修正断言的状态码为正确的200
  expect(response.status).toBe(200)
})

方案二:保留done参数,补充调用逻辑

如果需要继续使用done回调的写法,需要补充try catch逻辑,在测试正常结束时调用done(),断言失败时把错误传入done:

it('responds with json', async function(done) {
  try {
    const response = await request(app)
      .get('/user')
    expect(response.status).toBe(200)
    done()
  } catch (err) {
    done(err)
  }
})
通用排查思路

如果后续再遇到类似的Jest测试超时问题,可以按以下步骤排查:

  • 优先检查是否混用了async/await和done回调,有没有漏写done()调用
  • 检查所有断言逻辑是否正确,断言抛出异常会中断代码执行,导致收尾逻辑无法运行
  • 确认测试请求的接口可正常响应,排除服务未启动、路由配置错误等问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 20:36:08