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

使用jest mockRejectedValue时自定义错误对象返回为空的问题

自定义Error类在Jest mockRejectedValue后序列化为空对象的原因及解决办法

核心原因

  1. 原型链断裂:自定义Error类继承Error后,若未手动修复原型链,实例的原型会被错误设置为Error.prototype而非你的自定义类原型。这会导致自定义属性(比如details)在Jest的mock序列化逻辑中无法被枚举,最终JSON.stringify(error)输出空对象。
  2. 未正确调用父类构造函数:如果自定义Error的构造函数没调用super()(或带消息的super(message)),Error类的内部属性初始化异常,会间接导致自定义属性无法被正常识别。

解决办法

1. 修复自定义Error类的实现

按照标准规范编写自定义Error,确保原型链和构造逻辑正确:

class MyCustomError extends Error {
  public details: string[];

  constructor(details: string[]) {
    // 必须调用super,传入错误消息(可自定义)
    super('自定义错误触发');
    // 挂载自定义属性
    this.details = details;
    // 修复原型链,确保实例属于MyCustomError类型
    Object.setPrototypeOf(this, MyCustomError.prototype);
    // 可选:设置错误名称,方便调试区分
    this.name = 'MyCustomError';
  }

  // 可选:实现toJSON方法,强制JSON.stringify输出所需属性
  toJSON() {
    return {
      name: this.name,
      message: this.message,
      details: this.details,
      stack: this.stack
    };
  }
}

2. 验证测试中的mock有效性

  • 确保测试文件中导入的是真实的MyCustomError类,而非被Jest自动mock的版本。
  • 在catch分支中先验证错误类型:console.log(error instanceof MyCustomError),如果返回false,说明原型链问题未解决,按上面的代码修复即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 12:05:19