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

