You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何测试.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 04:40:34