javascript测试抛出特定错误类型应优先用expect(() => {...}).tothrow(构造函数)断言,支持内置和自定义错误类;手动catch需用tobeinstanceof;异步错误须用await expect(...).rejects.tothrow()。

在 JavaScript 中测试抛出特定错误类型的业务逻辑,核心是用 try...catch 捕获异常,并断言错误实例的类型(而非仅靠 message 字符串匹配),同时推荐使用现代测试框架(如 Jest、Vitest)提供的原生断言能力来简化流程。
用 expect(() => {...}).toThrow(构造函数) 直接验证错误类型
Jest 和 Vitest 都支持直接传入错误构造函数作为参数,这是最简洁、最可靠的方式:
- ✅ 正确匹配
instanceof关系,不依赖错误消息内容 - ✅ 支持内置错误(
TypeError、RangeError)和自定义错误类 - ❌ 不要传字符串(如
.toThrow("Invalid input")),那只会匹配message,无法保证类型安全
示例:
<pre class="brush:php;toolbar:false;">test("validateAge 抛出 RangeError 当年龄小于 0", () => {
expect(() => validateAge(-5)).toThrow(RangeError);
});
class ValidationError extends Error {}
test("submitForm 抛出 ValidationError 当邮箱格式错误", () => {
expect(() => submitForm({ email: "invalid" })).toThrow(ValidationError);
});
手动捕获并用 instanceof 断言(兼容性更强)
当使用不支持 .toThrow(构造函数)
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
try...catch:
- 用
expect(error).toBeInstanceOf(YourErrorClass)(Jest/Vitest) - 或直接写
expect(error instanceof CustomError).toBe(true) - 还可进一步断言
error.message或自定义字段(如error.code)
示例:
<pre class="brush:php;toolbar:false;">test("fetchUser 抛出 NetworkError 并带 status 字段", () => {
try {
fetchUser("invalid-id");
fail("应该抛出错误");
} catch (error) {
expect(error).toBeInstanceOf(NetworkError);
expect(error.status).toBe(503);
}
});
测试异步操作中抛出的错误(Promise 拒绝)
异步函数(async
.toThrow(),需用 await expect(...).rejects:
await expect(asyncFn()).rejects.toThrow(TypeError)await expect(asyncFn()).rejects.toBeInstanceOf(CustomError)- 注意:必须
await,否则断言会跳过
示例:
<pre class="brush:php;toolbar:false;">test("loadConfig 异步抛出 SyntaxError 当 JSON 格式错误", async () => {
await expect(loadConfig("bad.json")).rejects.toThrow(SyntaxError);
});
避免常见陷阱
以下做法看似可行,实则不可靠:
- ❌
.toThrow("Something went wrong") —— 消息易变,类型无保障 - ❌
expect(() => fn()).toThrow();—— 只确认抛错,不校验类型 - ❌ 在测试中直接调用
fn()而不包裹在函数里:expect(fn()).toThrow(...)会立即执行并中断测试 - ❌ 忘记
await测试异步错误,导致断言失效或测试通过但实际未校验
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










