使用jest mockRejectedValue时自定义错误对象返回为空的问题
自定义Error类在Jest mockRejectedValue后序列化为空对象的原因及解决办法
核心原因
- 原型链断裂:自定义Error类继承
Error后,若未手动修复原型链,实例的原型会被错误设置为Error.prototype而非你的自定义类原型。这会导致自定义属性(比如details)在Jest的mock序列化逻辑中无法被枚举,最终JSON.stringify(error)输出空对象。 - 未正确调用父类构造函数:如果自定义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
相关产品推荐
相关产品推荐

