JavaScript单元测试捕获异常需包裹待测代码为函数,同步用toThrow/throwError断言,异步用rejects,覆盖非法输入并支持try-catch细粒度校验。

前端开发中 JavaScript 单元测试处理异常抛出,核心是让测试框架捕获错误而非让它中断执行。直接调用会提前崩溃,必须把待测代码包裹成函数交给断言工具检查。
用 toThrow 或 toThrowError 断言同步异常
主流框架(Jest、Vitest)都提供专用匹配器,但必须传函数引用,不能传调用结果:
- 正确写法:expect(() => divide(10, 0)).toThrow(/division by zero/)
- 更精准校验类型:expect(() => parseJSON('{')).toThrowError(SyntaxError)
- 链式验证属性:expect(() => throwCustomErr()).toThrowError(MyError).toHaveProperty('code', 'INVALID_ID')
异步异常必须用 rejects
async 函数或返回 Promise 的代码出错时,toThrow 完全无效,因为函数本身同步返回 Promise:
- 正确写法:await expect(fetchData('/404')).rejects.toThrow('Network error')
- 校验错误结构:await expect(apiCall()).rejects.toMatchObject({ name: 'ApiError', status: 500 })
- 避免手动 try/catch——既冗长又容易漏掉未捕获的 rejection
覆盖典型非法输入场景
防护逻辑是否健壮,取决于你是否主动触发常见异常输入并验证响应:
立即学习“Java免费学习笔记(深入)”;
- 空值类:null、undefined、''、[](业务不允许时)
- 类型错位:传字符串代替数字、对象代替回调
- 边界值:负数、NaN、Infinity、超长字符串
- 格式违规:非法邮箱、非 ISO 日期、缺失必填字段的对象
需要细粒度控制时用 try-catch + expect
当断言库不支持 toThrow(如 Chai),或需检查堆栈、自定义字段、多条件组合时,可手动捕获:
- 在 try 中执行被测代码,catch 中赋值 error 变量
- 立即断言 error 是否存在:expect(error).toBeDefined()
- 再断言类型:expect(error).toBeInstanceOf(TypeError)
- 最后验证消息或属性:expect(error.message).toContain('required')


















