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
相关产品推荐
相关产品推荐

