单元测试中如何创建带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
相关产品推荐
相关产品推荐

