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

Jest自动模拟装饰器报错:TypeError: decorator is not a function 解决方法

解决Jest自动模拟装饰器模块报错的问题

问题原因

Jest的默认自动模拟(jest.mock("module"))虽会生成模拟对象,但对于装饰器这类需要保持函数类型且返回特定值的场景,可能因模拟结构不符合预期,或默认空函数无法满足装饰器调用逻辑,导致出现TypeError: decorator is not a function错误。

无需手动逐个模拟的解决方案

使用Jest工厂函数模拟,结合jest.requireActual获取原模块导出结构,自动将所有导出项替换为符合要求的模拟装饰器函数:

jest.mock('module-that-exports-decorator', () => {
  // 获取原模块的真实导出结构
  const actualModule = jest.requireActual('module-that-exports-decorator');
  
  // 遍历所有导出项,替换为模拟装饰器
  return Object.fromEntries(
    Object.entries(actualModule).map(([exportName, _]) => {
      // 模拟装饰器:返回传入的第一个参数(符合装饰器基本行为)
      const mockDecorator = jest.fn((target, ...rest) => target);
      return [exportName, mockDecorator];
    })
  );
});

说明

  • jest.requireActual用于获取原模块的导出结构,保证模拟模块的导出项与原模块完全一致,无需手动列举每个装饰器。
  • 模拟的装饰器函数返回传入的第一个参数(通常是被装饰的类、函数或属性),确保装饰器调用逻辑不会中断测试流程。
  • 所有模拟装饰器都是jest.fn()实例,可在测试中通过mockDecorator.mock.calls验证调用情况。

如果模块是默认导出单个装饰器,可使用更简洁的写法:

jest.mock('module-that-exports-decorator', () => ({
  __esModule: true,
  default: jest.fn((target) => target)
}));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:45:28