javascript中测试抛异常函数应使用expect(() => fn()).tothrow()捕获验证,异步需用await expect(asyncfn()).rejects.tothrow(),禁用直接调用或忽略await。

在 JavaScript 中测试抛出异常的函数,核心是用断言捕获并验证错误类型、消息或其它属性,而不是让测试因未捕获的异常而失败。
用 expect(() => {...}).toThrow() 捕获异常(Jest 推荐)
Jest 提供了简洁可靠的断言方式:把待测函数调用包裹在箭头函数中,再用 .toThrow() 判断是否抛出异常。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 不带参数时,只检查是否抛出任意错误:
expect(() => fn()).toThrow() - 传入字符串,匹配错误消息(子串匹配):
expect(() => fn()).toThrow("Invalid input") - 传入正则,做更灵活的消息匹配:
expect(() => fn()).toThrow(/invalid/i) - 传入错误构造函数(如
TypeError),验证错误类型:expect(() => fn()).toThrow(TypeError)
手动 try/catch + expect 验证(兼容所有测试框架)
若不使用 Jest,或需校验错误对象的更多细节(如自定义属性、堆栈等),可用传统 try/catch:
- 确保
expect写在catch块内,并在try块末尾加fail()或expect(true).toBe(false)防止无异常时测试“静默通过” - 示例(Jasmine / Vitest / 自定义断言):
let error;
try { fn(); } catch (e) { error = e; }
expect(error).not.toBeUndefined();
expect(error.message).toContain("required");
expect(error.name).toBe("RangeError");
注意异步函数抛错的写法(如 async 函数)
异步函数抛出的是 Promise rejection,不能直接用 .toThrow(),必须用 .rejects 链式断言:
- 正确:
await expect(asyncFn()).rejects.toThrow("Network failed") - 错误:
expect(() => asyncFn()).toThrow(...)—— 这只会断言返回 Promise 的动作,不等待 rejection - 也可配合
await expect(...).rejects.toMatchObject({...})校验错误结构
避免常见陷阱
- 别直接调用函数:❌
expect(fn()).toThrow()—— 错误会在进入 expect 前就抛出,导致测试中断 - 别忘了 await 异步断言:❌
expect(asyncFn()).rejects...而不 await,会变成对 pending Promise 的断言,结果不可靠 - 慎用
.toThrowError()(Jest):它和.toThrow()行为一致,但名字易误导;官方文档明确推荐统一用.toThrow()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










