如何测试.then()回调内的函数?Jest单元测试问题求助
解决Jest测试中.then回调内方法断言失效的问题
你的问题核心在于SheetManager.hide的mock没有返回Promise,导致.then回调根本不会执行,SheetManager.show自然不会被调用,断言也就失效了。
业务代码回顾
const show = () => { SheetManager.hide('Screen1') .then(() => { SheetManager.show('Screen2', { payload: { preSheet: id, }, }); }); };
修改后的测试代码
// 让hide的mock返回已resolved的Promise,确保then回调能触发 jest.spyOn(SheetManager, 'hide').mockResolvedValue(); jest.spyOn(SheetManager, 'show').mockImplementation(() => {}); // 调用待测试的show函数 show(); // 先断言hide的调用情况 expect(SheetManager.hide).toHaveBeenCalledTimes(1); expect(SheetManager.hide).toHaveBeenCalledWith('Screen1'); // 等待Promise微任务队列执行完毕,确保then回调中的show被调用 await Promise.resolve(); // 再断言show的调用情况 expect(SheetManager.show).toHaveBeenCalledTimes(1); expect(SheetManager.show).toHaveBeenCalledWith('Screen2', { payload: { preSheet: id, // 需确保测试环境中id变量有正确值 }, });
关键说明
- 原测试里
mockImplementation(() => {})让hide返回undefined,不是Promise,因此.then逻辑不会触发。改用mockResolvedValue()让它返回已完成的Promise,才能进入回调执行show。 - 调用
show()后,.then内的代码属于微任务,需要用await Promise.resolve()等待微任务队列执行完毕再断言;也可以用waitFor包裹断言,效果一致。 - 测试环境中要提前定义好
id变量,否则断言show的第二个参数会失败。
内容的提问来源于stack exchange,提问作者YI LU
相关产品推荐
相关产品推荐

