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

Vitest测试异步函数遇未处理错误及断言失败问题排查

问题原因分析

1. 同步断言toThrowError()触发未处理拒绝

getStagedFilesDiff是异步函数,它内部的错误会以Promise拒绝(rejection)的形式抛出,而非同步错误。你用expect(() => getStagedFilesDiff()).toThrowError()时,这个断言只会检查箭头函数执行时的同步抛出错误,但异步函数返回的Promise拒绝没有被任何代码捕获,直接变成了未处理的Promise拒绝,所以Vitest会报“Vitest caught 1 unhandled error during the test run”。

2. rejects断言的错误写法导致断言失败

你改用await expect(() => getStagedFilesDiff()).rejects.toThrowError(undefined)时,写法逻辑有误:expect接收的箭头函数本身不会把内部的Promise传递给rejects断言处理。正确的写法应该是直接传递Promise对象给expect,也就是await expect(getStagedFilesDiff()).rejects.toThrow()——因为getStagedFilesDiff()直接返回Promise,用箭头函数包裹后,expect会把它当成同步函数执行,不会等待内部Promise完成,自然检测不到拒绝行为,所以触发“AssertionError: expected [Function] to throw an error”。

3. 函数内部加try/catch后测试通过

给getStagedFilesDiff添加try/catch后,内部的Promise拒绝被函数自身捕获,不会向外传递未处理的Promise拒绝。此时如果你的测试是验证函数不会抛出未处理错误,或者你在catch逻辑中做了符合预期的处理(比如返回默认值、重新抛出错误后测试用正确方式捕获),Vitest就不会检测到未处理错误,断言也就符合预期通过了。

注意:如果你的测试目标是验证函数在错误场景下会抛出错误,那内部的try/catch必须重新抛出错误(throw error),再配合正确的rejects断言才能完成有效测试。

内容的提问来源于stack exchange,提问作者Tal Rofe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:44:54