如何测试被测函数是否调用了导入的Promise?
问题分析与解决方法
核心问题
- 被测函数
functionToTest缺少async关键字:使用await的函数必须声明为async,否则会触发语法错误,导致函数无法正常执行,自然不会调用externalPromise。 - 测试代码未等待异步操作完成:即使修复了
async问题,直接调用functionToTest()后立即执行断言,Jest会在异步函数的Promise完成前就结束测试,导致断言时机过早。
步骤1:修复被测函数
给functionToTest添加async关键字:
import { externalPromise } from '@helpers'; export const functionToTest = async () => { return await externalPromise(); }
步骤2:修正测试代码(三种可选方式)
任选一种让Jest等待异步操作完成的写法:
方式一:使用async/await(最直观)
it('should call externalPromise', async () => { await functionToTest(); expect(externalPromise).toHaveBeenCalled(); });
方式二:返回Promise
让测试函数返回functionToTest的Promise链,Jest会自动等待其完成:
it('should call externalPromise', () => { return functionToTest().then(() => { expect(externalPromise).toHaveBeenCalled(); }); });
方式三:使用done回调
适合处理更复杂的异步逻辑,通过done()通知Jest测试结束:
it('should call externalPromise', (done) => { functionToTest().then(() => { expect(externalPromise).toHaveBeenCalled(); done(); }); });
验证mock正确性
你的jest.mock写法是正确的,已经成功将externalPromise替换为Jest模拟函数,修复上述问题后即可正常捕获调用记录。
内容的提问来源于stack exchange,提问作者Tamás Polgár
相关产品推荐
相关产品推荐

