测试 Promise 的核心是正确等待其完成,推荐用 async/await 写测试函数;也可返回 Promise 让框架自动等待;验证拒绝需用 expect(...).rejects;须避免忘记 await/return、混用 callback、未清理副作用等陷阱。

测试 Promise 返回结果,核心是让测试框架等待异步操作完成后再断言。关键不是“怎么写断言”,而是“怎么正确等待 Promise 被 resolve 或 reject”。
用 async/await 写测试函数(推荐)
现代测试框架(如 Jest、Vitest、Jasmine)都支持在测试中使用 async 函数。这是最直观、可读性最好的方式:
- 测试函数声明为
async,内部用await等待 Promise 完成 - 直接对返回值做断言,就像同步代码一样自然
- 如果 Promise reject,测试会自动失败(除非显式捕获)
示例(Jest):
test('fetchUser 返回正确的用户名', async () => {const user = await fetchUser(123);
expect(user.name).toBe('Alice');
});
返回 Promise(传统但依然有效)
不写 async/await,而是直接 return 被测 Promise,测试框架会自动等待它 settle:
立即学习“Java免费学习笔记(深入)”;
- 适合简单场景,尤其在不支持
async的老环境(极少) - 注意:必须
return,漏掉 return 会导致测试提前结束 - reject 需用
.catch()处理,否则可能抛出未处理异常
示例:
test('fetchUser 拒绝无效 ID', () => {return fetchUser(-1).catch(err => {
expect(err.message).toContain('invalid id');
});
});
处理 Promise 拒绝(reject)的断言
验证 Promise 是否按预期失败,不能只靠 catch,要用框架提供的工具确保断言执行:
- Jest 推荐用
expect(...).rejects链式断言(无需 try/catch) - Vitest 同样支持
.rejects,语法一致 - 避免裸写
fetchUser(-1).catch(...)而不 return,否则测试无法感知 reject
示例:
test('fetchUser rejects on invalid ID', async () => {await expect(fetchUser(-1)).rejects.toThrow('invalid id');
});
避免常见陷阱
几个高频出错点:
- 忘记 return 或 await:测试函数立即结束,断言不执行
-
混用 callback 和 async:比如在
async test()里又传done,造成双重控制 - 没清理副作用:如 mock 的定时器、网络请求没 restore,影响后续测试
-
用
setTimeout模拟延迟但没等它:需确保所有异步路径都被 await 或 return


















