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

异步测试断言失效:返回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:29:55