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

Jest+TypeScript测试自定义Hook:模拟本地模块导出后Mock调用验证失败

问题解决方法

1. 修正Mock写法

你当前的Mock逻辑写错了——你让getToken返回一个指向getTokenMock的函数,而不是直接把getTokenMock作为getToken的实现。原Hook里是直接调用getToken(),这会导致实际执行的是() => getTokenMock,根本没触发getTokenMock函数。

修正后的Mock代码:

// 提前给mock函数设置异步返回值,模拟真实接口行为
const getTokenMock = jest.fn().mockResolvedValue('mock-token');

jest.mock('../api', () => ({
  getToken: getTokenMock, // 直接把mock函数赋值给getToken
}));

2. 处理异步逻辑

因为getToken是异步函数,Hook里的useEffect执行的是异步流程,测试时必须用RTL的waitFor等待异步操作完成,不然断言会在Mock被调用前就执行,自然得到0次调用的结果。

修正后的测试用例:

describe('useTokenHook', () => {
  it('should call getToken on mount', async () => {
    renderHook(() => useTokenHook(), { wrapper });

    await waitFor(() => {
      expect(getTokenMock).toBeCalledTimes(1);
    });
  });
});

3. 额外检查项

  • 确保wrapper组件正确提供了Redux Store:因为Hook里用到了useSelector,如果没有正确注入Store,useSelector会报错,直接阻断useEffect的执行。
  • 确认someVariable的初始值能触发useEffect:如果useSelector返回的初始值不会触发依赖项变化,useEffect不会执行,Mock自然不会被调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 01:59:59