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
相关产品推荐
相关产品推荐

