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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:36:04