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

如何用Jest测试异步方法抛出的异常?测试失败求助

Jest异步函数异常类验证失败的解决方法

你的异步测试失败的核心原因是写法错误——你把异步函数额外包裹在了async () => ...箭头函数里,导致Jest无法正确捕获异步Promise的reject状态。

错误写法分析

原测试代码中:

test("async failure", async () => await expect(async () => await asyncAction(true)).rejects.toThrow(SyntaxE));

这里的async () => await asyncAction(true)是一个同步执行的函数(它本身不会抛出同步异常,仅返回Promise),而expect的.rejects方法需要直接接收Promise实例,而非返回Promise的函数。

修正后的完整代码

去掉多余的包裹箭头函数,直接将asyncAction(true)返回的Promise传给expect:

describe("Trying to get Jest working", ()=>
{
    test("sync success",        () =>       expect(      syncAction(false)).toBe(42));
    test("sync failure",        () =>       expect(() => syncAction(true)).toThrow(SyntaxE));
    test("async success", async () =>       expect(await asyncAction(false)).toBe(42));
    // 修正后的异步失败测试
    test("async failure", async () => await expect(asyncAction(true)).rejects.toThrow(SyntaxE));
});


class SyntaxE {
    message: string;
    constructor(message: string)
    {
        this.message = message;
    }
}
async function asyncAction(p: boolean)
{
    if(p)
        throw new SyntaxE("Oops!")
    else
        return 42;
}
function syncAction(p: boolean)
{
    if(p)
        throw new SyntaxE("Oops!")
    else
        return 42;
}

替代写法

如果不想使用await,也可以直接返回Promise让Jest自动处理:

test("async failure", () => expect(asyncAction(true)).rejects.toThrow(SyntaxE));

两种写法都能正确捕获异步函数抛出的SyntaxE异常,验证其类是否匹配。

内容的提问来源于stack exchange,提问作者Антон Игоревич Злыгостев

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 18:05:04