使用Jest测试时报'TypeError: XXX.sub is not a function'如何修复
Jest测试报.sub is not a function修复方案
问题相关代码
- 业务侧通用事件订阅方法(生产环境运行正常):
UseMeToSub = (class: string, event: string, callback: () => void) => { // 省略内部其他逻辑 return class[event].sub(callback); }
- 初始编写的Jest测试用例:
test.('UseMeToSub () => { // 初始化待测试类实例 const classtoTest = initclasstoTest(); const callback = jest.fn(); // 第3行 报错触发位置 classtoTest.UseMeToSub('someClass' 'SomeEvent', callback); // 省略后续测试逻辑 });
- 运行抛出的错误:
.sub is not a function
报错原因
- 测试代码存在基础语法笔误:
test关键字后多写了多余的点、'someClass'和'SomeEvent'两个入参之间漏了逗号,但这不是触发sub不存在错误的核心原因。 - 核心原因:测试环境下,传入的
someClass对应的SomeEvent属性,不是生产环境中自带sub订阅方法的事件实例(比如项目自定义事件对象、RxJS Subject实例这类实现了订阅接口的对象)。测试初始化流程没有给这个事件挂载合法的带sub方法的实例,执行到class[event].sub(callback)时,取到的class[event]上根本没有sub函数,自然抛出类型错误。
修复方案
- 先修正测试代码的基础语法错误,去掉
test后多余的点,补全入参之间缺失的逗号。 - 在调用
UseMeToSub方法前,手动给目标类的对应事件mock一个带sub方法的假实例,完全模拟生产环境的事件对象结构。 - 执行调用逻辑后,增加断言验证
sub方法是否被正确传入回调、符合预期调用即可。
修复后的完整测试代码参考:
test('UseMeToSub', () => { const classtoTest = initclasstoTest(); const callback = jest.fn(); // 新增:mock带sub方法的事件实例 const mockSubMethod = jest.fn(); const mockEvent = { sub: mockSubMethod }; // 将mock的事件实例挂载到代码实际读取类的对应位置,根据你项目的类存储路径调整即可 classtoTest['someClass']['SomeEvent'] = mockEvent; // 修正入参逗号问题后调用订阅方法 classtoTest.UseMeToSub('someClass', 'SomeEvent', callback); // 断言验证逻辑 expect(mockSubMethod).toHaveBeenCalledWith(callback); // 补充其余你的测试逻辑 });
提示:如果你的项目里类实例是存在全局映射表、而非挂载在
classtoTest实例上,只需要把mock的事件实例挂载到代码实际读取类的对应存储位置,保证执行class[event]时取到的是带sub方法的mock对象即可解决报错。
内容的提问来源于stack exchange,提问作者YTG
相关产品推荐
相关产品推荐

