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

使用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

报错原因

  1. 测试代码存在基础语法笔误:test关键字后多写了多余的点、'someClass'和'SomeEvent'两个入参之间漏了逗号,但这不是触发sub不存在错误的核心原因。
  2. 核心原因:测试环境下,传入的someClass对应的SomeEvent属性,不是生产环境中自带sub订阅方法的事件实例(比如项目自定义事件对象、RxJS Subject实例这类实现了订阅接口的对象)。测试初始化流程没有给这个事件挂载合法的带sub方法的实例,执行到class[event].sub(callback)时,取到的class[event]上根本没有sub函数,自然抛出类型错误。

修复方案

  1. 先修正测试代码的基础语法错误,去掉test后多余的点,补全入参之间缺失的逗号。
  2. 在调用UseMeToSub方法前,手动给目标类的对应事件mock一个带sub方法的假实例,完全模拟生产环境的事件对象结构。
  3. 执行调用逻辑后,增加断言验证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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:57:20