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

报错Cannot read property 'calls' of undefined:Dispatcher Mock函数未定义

嘿,这个报错我太熟了!本质问题是你没把dispatcher的register方法正确mock成Jest的模拟函数,导致你想访问mock.calls属性时,它根本不存在~

问题根源

你之前在beforeEach里直接引入的是真实的dispatcher模块,它的register是业务代码里的真实方法,不是Jest的mock函数。所以dispatcher.register.mock是undefined,访问.calls自然就抛出错误了。

解决步骤

1. 先Mock整个dispatcher模块

在测试文件的最顶部(describe代码块外面),用jest.mock替换真实的dispatcher模块,让它返回一个带有mock版register方法的对象。这样Jest会自动把所有对该模块的引入都换成mock版本:

// 放在测试文件最顶部,describe代码块之外
jest.mock('../../dispatcher', () => ({
  default: {
    register: jest.fn()
  }
}));

2. 修改测试代码,确保使用Mock后的dispatcher

调整你的测试结构,同时可以在beforeEach里重置mock的调用记录,避免测试用例间互相污染:

describe('testStore', () => { 
  let dispatcher;

  beforeEach( () => { 
    // 现在拿到的是mock后的dispatcher
    dispatcher = require('../../dispatcher').default;
    // 清空上一个测试用例的调用记录,保证测试独立性
    dispatcher.register.mockClear();
  }); 

  it('test1', () => { 
    // 关键:先执行会触发dispatcher.register的代码(比如初始化你的store)
    // 示例:假设你的store在初始化时会调用register
    // require('../../yourStore');

    // 现在就能正常访问mock的calls属性了
    expect(dispatcher.register.mock.calls.length).toBe(1); 
  }); 
});

3. 额外检查点

如果修改后还是得到0,那大概率是你的测试用例里没有执行到调用dispatcher.register的代码——比如你没初始化store,或者该逻辑在异步操作里(这种情况需要用async/await处理异步)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:16:37