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

Jest测试中如何正确校验TypeScript自定义错误是否被抛出

问题原因

TypeScript 当编译目标(tsconfig.json 中 compilerOptions.target)设置为 ES5 及更低版本时,继承 Error、Array 这类原生内置构造函数会出现原型链断裂的问题,导致自定义错误类的实例无法通过 instanceof 校验,Jest 的 toThrow(自定义错误类) 底层依赖 instanceof 判断,因此会判定抛出的是普通 Error 实例。

解决方案

方案1:手动修正原型指向(最通用)

在自定义错误类的构造函数中手动设置原型,修改后的错误类代码如下:

export class UserNotFoundError extends Error {
  constructor() {
    super('User not found');
    // 新增这一行手动修正原型
    Object.setPrototypeOf(this, UserNotFoundError.prototype);
    this.name = 'UserNotFoundError';
  }
}

修改后无需改动测试代码,原有 toThrow(UserNotFoundError) 校验即可正常通过。

方案2:调高TS编译目标

如果项目不需要兼容ES5及更低版本的运行环境,可以直接修改 tsconfig.json 中的编译目标:

{
  "compilerOptions": {
    "target": "ES2015" // 或更高版本,比如ES2020、ESNext
  }
}

原生支持ES6的环境下类继承逻辑是正常的,不会出现原型链断裂问题。

方案3:调整测试校验逻辑(兜底方案)

如果不想修改业务代码,可以调整测试用例的校验逻辑,改为判断错误的name属性或者错误信息:

it ('Should throw an UserNotFoundError', async () => {
  await expect(() => {
    return createPost.exec('My content', 'no-user-with-this-id');
  }).rejects.toHaveProperty('name', 'UserNotFoundError');
  // 也可以同时校验错误信息
  // await expect(...).rejects.toThrow('User not found');
});

内容的提问来源于stack exchange,提问作者Thiago Nelsi do Couto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:18:00