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

