测试异步第三方库需精准 mock 实际调用方法,用闭包管理状态模拟重试与错误,抽离为可注入函数避免全局依赖,并验证调用过程而非仅结果。

测试异步第三方库的关键,是不让真实调用发生,只模拟它“被调用时怎么响应”,而不是复制它的行为逻辑。
只 mock 实际用到的方法,不照搬整个 API
第三方库往往提供十几个方法,但一个测试通常只用其中一两个。比如你用了 stripe.paymentIntents.create(),就不用管 retrieve() 或 cancel()。
- 检查测试代码里真正调用了哪些函数、传了什么参数、期待什么返回值或错误
- 用 plain object 模拟最小接口:只包含这几个方法,其余字段/方法一律不写
- 避免用
jest.mock('stripe')自动模拟全部——容易漏掉类型或行为偏差
用状态可控的 mock 函数替代硬编码返回
真实场景常有重试、首次失败、条件降级等逻辑。靠堆 mockResolvedValueOnce 容易混乱,改用闭包管理状态更清晰。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 定义一个计数器变量(如
attempt = 0),在 mock 函数内递增并分支返回 - 对网络超时、token 过期、429 限流等典型错误,显式抛出对应 Error 实例
- 提供
.reset()方法,在afterEach中重置状态,防止测试污染
把第三方调用抽成可注入函数
最难 mock 的不是库本身,而是业务代码直接依赖了它的全局实例或默认导出。
- 重构关键调用为独立函数,例如
createPaymentIntent(options),内部才调用stripe.paymentIntents.create() - 测试时传入自己的 mock 版本:
testFn({ createPaymentIntent: mockCreate }) - 这样既绕过模块加载时机问题,也避免
jest.mock()失效风险(尤其 ESM 环境)
验证调用过程,不只是最终结果
异步链中常有副作用:发请求、写 localStorage、触发事件。光看返回值不够,得确认它“做了什么”。
- 用
mockFn.mock.calls.length断言是否调用、调用几次 - 用
mockFn.mock.calls[0][0]检查第一次传入的参数结构是否符合预期 - 若涉及 AbortSignal,主动
abortController.abort(),再验证后续 Promise 是否终止、无副作用










