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

如何在Jest中mock Chakra UI的createStandaloneToast及isActive方法

核心问题

你当前的mock只将createStandaloneToast的返回值设置为普通mock函数,没有挂载业务代码中用到的isActive方法,所以无法控制这部分逻辑的返回值,调整方案如下:

实现步骤

1. 调整全局mock结构

由于Chakra UI的createStandaloneToast返回的toast实例本身是可调用函数,同时函数上挂载了isActive实例方法,你需要让mock结构和原生结构对齐:

// 单独声明两个mock函数,方便后续单测中动态修改返回值
const mockIsActive = jest.fn();
const mockToastFn = jest.fn();
// 给toast调用函数挂载isActive方法
mockToastFn.isActive = mockIsActive;

jest.mock('@chakra-ui/react', () => {
  return {
    ...jest.requireActual('@chakra-ui/react'),
    createStandaloneToast: () => mockToastFn,
  };
});

2. 单测中按需控制isActive返回值

根据测试场景需要,直接修改mockIsActive的返回值即可覆盖不同分支逻辑:

测试场景:同状态码错误首次出现,正常弹出toast

test('首次出现指定状态码错误时弹出toast', () => {
  // 模拟当前无对应id的活跃toast
  mockIsActive.mockReturnValue(false);
  // 此处替换为你触发axios拦截器的逻辑
  runYourAxiosInterceptor({ status: 403 });
  // 验证toast调用符合预期
  expect(mockToastFn).toHaveBeenCalledWith(expect.objectContaining({
    id: 403,
    status: 'error'
  }));
});

测试场景:同状态码错误重复出现,不重复弹出toast

test('同状态码错误重复出现时不弹出重复toast', () => {
  // 模拟当前已有对应id的活跃toast
  mockIsActive.mockReturnValue(true);
  // 触发axios拦截器逻辑
  runYourAxiosInterceptor({ status: 403 });
  // 验证toast未被重复调用
  expect(mockToastFn).not.toHaveBeenCalled();
});

内容的提问来源于stack exchange,提问作者RyanP13

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:24:04