如何在Jest中测试Redux的store.subscribe()回调函数
问题原因
- Redux 中
store.subscribe注册的回调仅在 store 状态通过dispatch触发更新后才会执行,你当前的测试用例只完成了订阅操作,没有触发任何状态变更,所以回调自然不会执行,额外增加等待时间也不会生效。
正确测试方案
场景1:测试自定义注册的订阅回调
test('should call subscribe callback when state changes', () => { const store = configureStore(initialState); // 使用jest mock函数包装订阅回调,便于校验调用情况 const mockSubscribeCallback = jest.fn(() => console.log(store.getState())); store.subscribe(mockSubscribeCallback); // 核心步骤:dispatch 合法的action触发状态变更 store.dispatch({ type: 'TEST_UPDATE', payload: 'test content' }); // 校验回调被正常调用 expect(mockSubscribeCallback).toHaveBeenCalledTimes(1); })
场景2:测试业务代码中预先注册的全局订阅(对应你index.ts中的代码)
需要提前mock console.log 来捕获调用行为:
// 先mock全局console.log,注意要在引入store模块前执行mock jest.spyOn(console, 'log').mockImplementation(() => {}); test('should call pre-registered subscribe callback when state changes', () => { // 引入业务代码中的store实例 const { store } = require('./index.ts'); // 触发状态更新 store.dispatch({ type: 'TEST_UPDATE', payload: 'test content' }); // 校验console.log被调用,且参数为更新后的state expect(console.log).toHaveBeenCalledWith(store.getState()); // 测试完成后恢复console.log的原始实现 console.log.mockRestore(); })
注意事项
- 请确保你dispatch的action可以被store的reducer正常处理,且处理后会返回新的state引用,若修改前后state引用相同,
store.subscribe不会触发回调。 - 若你的store是在模块顶层完成创建和订阅注册的,必须保证mock操作早于store模块的引入,否则mock无法捕获注册阶段的调用行为。
内容的提问来源于stack exchange,提问作者polRk
相关产品推荐
相关产品推荐

