jest 的 resolves 和 rejects 匹配器用于简洁断言 promise 的 fulfilled 或 rejected 状态:resolves 后接普通匹配器验证成功值,rejects 用于校验错误;必须 return 或 await 以确保 jest 等待,不可混用 then/catch。

Jest 提供了 resolves 和 rejects 匹配器,专用于简洁、可读地断言 Promise 的终态(fulfilled 或 rejected),无需手动写 .then() / .catch() 或 async/await + try/catch。
用 resolves 断言 Promise 成功并检查返回值
当期望 Promise 正常 resolve 并返回特定值(如字符串、对象、数组等)时,把 expect(promise) 包裹在 .resolves 下,再接普通匹配器:
-
expect(fetchUser()).resolves.toBeDefined()—— 断言成功且结果非 undefined -
expect(api.get('/posts')).resolves.toEqual([{ id: 1, title: 'Hello' }])—— 断言成功且返回数组内容匹配 -
expect(Promise.resolve(42)).resolves.toBe(42)—— 最简示例,直接验证数值
用 rejects 断言 Promise 失败并检查错误
当期望 Promise 被 reject,且想校验错误类型或消息时,使用 .rejects:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
-
expect(fetchUser('invalid-id')).rejects.toThrow('Not Found')—— 断言抛出含该字符串的错误 -
expect(Promise.reject(new Error('Timeout'))).rejects.toThrowError(/timeout/i)—— 用正则忽略大小写匹配 -
expect(api.delete('/post/999')).rejects.toMatchObject({ status: 404 })—— 若 reject 值是 Error 对象且有自定义属性,可配合toMatchObject
注意点:必须 return 或 await,否则测试会提前通过
这两个匹配器本身返回一个 Promise,Jest 会自动等待它 settle。但你**必须让测试函数感知这个异步流程**:
- ✅ 正确写法(显式返回):
test('fetches user', () => expect(fetchUser()).resolves.toHaveProperty("name")) - ✅ 正确写法(async/await):
test('fetches user', async () => { await expect(fetchUser()).resolves.toHaveProperty("name") }) - ❌ 错误写法(无返回/await):
test('...', () => { expect(...).resolves... })→ Jest 不等待,测试可能跳过断言就结束
不能混用 resolves/rejects 和 then/catch
不要对同一个 Promise 同时用 .resolves 和 .then(),也不要在 .resolves 后链式调用 .catch()。Jest 的匹配器已封装处理逻辑,额外的手动处理反而会导致行为不可控或报错。










