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

单元测试中如何创建带statusCode属性的Error对象?

如何创建带statusCode属性的Error对象用于单元测试?

首先,完全理解你的场景:你要测试这段处理HTTP请求失败、自动刷新token的逻辑,已经把request.postStub成返回rejected Promise,但默认的Error没有statusCode属性,没法触发代码里的401分支判断对吧?

直接给你几个实用的解决方案:

1. 给普通Error实例动态添加属性

JavaScript的Error实例是可以动态附加属性的,哪怕构造函数只接收字符串参数。你可以这么写:

const authError = new Error('Unauthorized');
authError.statusCode = 401;
stubPost.callsFake(() => Promise.reject(authError));

这样reject出去的错误就带有statusCode: 401,完全能匹配你代码里的判断条件。

2. 定义自定义HTTP Error类(适合复用场景)

如果你的测试里经常需要带状态码的错误,不如封装一个自定义Error类,更规范:

class HttpError extends Error {
  constructor(message, statusCode) {
    super(message);
    this.statusCode = statusCode;
    // 修复原型链,确保instanceof判断正常
    Object.setPrototypeOf(this, HttpError.prototype);
  }
}

// 测试里使用
stubPost.callsFake(() => Promise.reject(new HttpError('Unauthorized', 401)));

3. 测试框架快捷写法(以Jest为例)

如果你用Jest这类测试框架,还能更简洁地创建带属性的Error:

// 用Object.assign直接给Error加属性
stubPost.mockRejectedValue(Object.assign(new Error('Unauthorized'), { statusCode: 401 }));

甚至可以直接返回一个模拟的错误对象(注意:这个对象不是严格的Error实例,但如果你的代码只检查statusCode属性,也能正常工作):

stubPost.mockRejectedValue({ statusCode: 401, message: 'Unauthorized' });

不过更推荐用真正的Error实例,避免后续代码里有err instanceof Error的判断时出现问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:16:23