使用Mocha+supertest+Chai测试可用接口出现超时错误如何解决
问题根因与解决方案
1. 断言异常导致done()未调用(最高概率)
你当前代码的断言逻辑没有异常捕获,一旦断言失败(如返回体结构不符合预期、属性不存在)会直接抛出AssertionError,后续的done()永远不会执行,测试就会卡住直到超时。
修复方案1(回调写法兼容)
给断言逻辑加try/catch捕获异常,错误时传给done:
const authPost = (title, endpoint, body, responseProperty, checkFirstElement = false) => { it(title, (done) => { request(app) .post(endpoint) .set({ "Authorization": `Bearer ${token}` }) .set("Content-Type", "application/json") .send(body) .end((error, response) => { if (error) return done(error); try { checkFirstElement ? response.body[0].should.have.property(responseProperty) : response.body.should.have.property(responseProperty); done(); } catch (assertErr) { done(assertErr); } }); }); }
修复方案2(更推荐的async写法,避免done漏调用)
Mocha原生支持async测试用例,直接用Promise写法完全不需要手动管理done:
const authPost = (title, endpoint, body, responseProperty, checkFirstElement = false) => { it(title, async () => { const response = await request(app) .post(endpoint) .set({ "Authorization": `Bearer ${token}` }) .set("Content-Type", "application/json") .send(body); checkFirstElement ? response.body[0].should.have.property(responseProperty) : response.body.should.have.property(responseProperty); }); }
2. 服务端请求未正常结束
如果修改后还是超时,排查服务端对应接口的逻辑:是否存在分支没有调用res.send()/res.json()/res.end(),导致请求一直处于挂起状态。可以在请求回调中先打印响应状态和内容确认是否有返回:
.end((error, response) => { console.log('状态码:', response?.status, '返回体:', response?.body) // 原有逻辑 })
3. 异步初始化未完成
如果你的app实例有异步初始化逻辑(如连接数据库、动态挂载路由),或者token是异步获取的,需要在before钩子中等待所有初始化完成再执行测试:
let token; before(async () => { // 等待app初始化完成 await app.waitForReady(); // 等待token获取完成 token = await getTestUserToken(); })
内容的提问来源于stack exchange,提问作者Nextrati
相关产品推荐
相关产品推荐

