async函数测试需在异步上下文中消费Promise:Jest中测试函数标记为async并await调用,或在普通函数中返回.then().catch()链;mock时须返回Promise,避免不await、不return等陷阱。

async 函数在测试中不能直接拿到返回值,因为它始终返回 Promise。想准确获取结果,关键不是“绕过 Promise”,而是**在测试框架支持的异步上下文中正确消费这个 Promise**。
Jest 中用 async/await 测试 async 函数
Jest 原生支持 async 测试函数。测试函数本身标记为 async,内部就能用 await 获取 async 函数的 resolve 值:
- 测试函数必须是
async,否则await会报语法错误 -
await后跟 async 函数调用,得到的是它return的原始值(非 Promise) - 抛出的错误会被 Jest 自动捕获并标记测试失败,也可手动
try/catch验证错误逻辑
示例:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
test('fetchUser 返回正确用户对象', async () => {
const user = await fetchUser(123);
expect(user.id).toBe(123);
expect(user.name).toBe('Alice');
});
test('fetchUser 抛出错误时被正确处理', async () => {
await expect(fetchUser(-1)).rejects.toThrow('Invalid ID');
});
使用 .then() / .catch() 在普通测试函数中处理
如果测试环境不支持顶层 async(比如旧版 Jest 或某些配置),可用 Promise 链:
- 调用 async 函数,得到 Promise 实例
- 用
.then()接收成功值,用.catch()捕获错误 - 必须显式返回该 Promise,否则 Jest 不知道要等什么
示例:
test('fetchData resolves with data', () => {
return fetchData().then(data => {
expect(data).toHaveProperty('items');
});
});
test('fetchData rejects on network error', () => {
return fetchData('bad-url').catch(err => {
expect(err.message).toContain('failed');
});
});
注意返回值类型与隐式包装
async 函数的返回值会被自动包装:
-
return 42→ 等价于Promise.resolve(42) -
return Promise.resolve('ok')→ 外层 Promise 状态和值由内层决定 -
throw new Error()或return Promise.reject(...)→ 外层 Promise 为 rejected
测试时若 mock 了 async 函数,需确保 mock 返回的是 Promise(如用 jest.fn().mockResolvedValue() 或 .mockRejectedValue()),否则可能因类型不符导致 await 行为异常。
避免常见陷阱
这些写法看似合理,但在 Jest 中会导致测试“通过但无实际校验”或“超时失败”:
-
test('...', () => { await fn(); })— 缺少async,语法错误 -
test('...', async () => { fn(); })— 调用了但没await,Jest 不等待 Promise 完成 -
test('...', () => { fn().then(...); })— 没有returnPromise,Jest 不等待 - 在
beforeEach中调用 async 函数却未await,后续测试可能读到未初始化的数据
只要测试函数声明为 async 并 await 目标调用,或显式返回 Promise 链,就能稳定、准确地获取 async 函数的返回值。










