异步测试断言失效:返回200状态码却判定测试通过
问题原因
你测试明明断言失败却仍通过的核心原因是:async函数中混合使用await与.then/.catch,导致断言抛出的错误没被Jest正确捕获。
当请求返回200进入.then回调后,expect(r.status).toBe(HttpStatusCode.BadRequest)会抛出断言失败的错误,但这个错误被Promise链式机制包裹,没有传递到Jest的测试上下文里,Jest误以为测试已正常完成,因此标记为通过。
解决方案
统一使用async/await + try/catch的写法替代.then/.catch,让Jest能正确捕获断言错误:
describe("Test", (): void => { test(`${prefix}: fake field`, async (): Promise<void> => { const stakingRequest : StakingRequest = new StakingRequest(address, address, address, address, amount, "TestField"); console.log("Request:" + JSON.stringify(stakingRequest)) console.log("Endpoint:" + `${config.api.path}${EndPoint.STAKE}`) await new Promise(resolve => setTimeout(resolve, wait)); try { const r = await instance.post(`${config.api.path}${EndPoint.STAKE}`, stakingRequest.createRequest()); console.log("Response:"); console.log(r.data); console.log(r.status); console.log(r.statusText); expect(r.status).toBe(HttpStatusCode.BadRequest); // 现在断言失败会被Jest捕获 } catch (error) { if (error.response) { expect(error.response).toBe(""); } } }, timeout); });
额外说明
如果一定要保留.then/.catch写法,需要确保把整个Promise链返回给Jest,让它等待执行完成:
// 去掉await,改为返回Promise链 return instance.post(`${config.api.path}${EndPoint.STAKE}`, stakingRequest.createRequest()) .then(r => { console.log("Response:"); console.log(r.data); console.log(r.status); console.log(r.statusText); expect(r.status).toBe(HttpStatusCode.BadRequest); }) .catch(error => { if (error.response) { expect(error.response).toBe(""); } });
但这种写法不如try/catch直观,也不符合async/await的设计初衷,更推荐前者。
内容的提问来源于stack exchange,提问作者27P
相关产品推荐
相关产品推荐

