javascript异步测试需将测试函数声明为async并用await等待,主流框架原生支持;异常须用try/catch或expect(() => {}).rejects断言;避免混用callback与async、清理操作要await、超时需合理设置、并发请求用promise.all。

在 JavaScript 异步测试中,async 和 await 不是“要额外处理”的问题,而是测试框架原生支持的工具——关键在于让测试函数本身声明为 async,并用 await 等待被测异步逻辑完成。
测试函数必须标记为 async
主流测试框架(如 Jest、Vitest、Jasmine)都允许测试用例函数返回 Promise。只要把 test 或 it 的回调函数声明为 async,框架就会自动等待其内部 Promise 完成,无需手动调用 .then() 或传入 done 回调。
- Jest 示例:
test('fetchUser 返回用户数据', async () => {
const user = await fetchUser(123);
expect(user.name).toBe('Alice');
});
- 不加
async就会跳过等待,导致断言执行时数据还没返回,测试可能意外通过或失败。
正确处理被测函数的异常
如果被测异步函数可能抛错(比如网络请求失败),不能只靠 expect(...).toThrow() ——因为 await 遇到 rejected Promise 会直接 throw,必须用 try/catch 捕获,再做断言。
- 错误写法(不会捕获):
await expect(fetchUser(999)).rejects.toThrow();(Jest 支持但语义模糊) - 推荐写法(清晰可控):
await expect(async () => {
await fetchUser(999);
}).rejects.toThrow('Network error');
避免常见陷阱
异步测试容易因时序或状态残留出错,注意三点:
-
不要混用 callback 和 async/await:例如在
test(..., done => {...})里又写await,会导致不可预测行为;统一用async即可。 -
清理副作用要异步等待:如果测试中创建了定时器、监听器或 mock,清理逻辑(如
afterEach)若涉及异步操作(如重置 API mock 状态),也应声明为async并await完成。 -
超时设置要合理:默认超时(如 Jest 是 5000ms)可能不够,对慢速模拟接口可显式加
jest.setTimeout(10000),避免误报超时失败。
并发请求测试需明确控制顺序
当测试多个 await 调用时,它们默认是串行的。若想验证并发行为(比如同时发两个请求),应改用 Promise.all 或 Promise.allSettled 包裹:
- const [user, posts] = await Promise.all([
fetchUser(1),
fetchPosts(1)
]); - 这样既保持测试可读性,又能准确反映真实并发场景。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











