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

如何用Jest仅模拟模块中单个类并保留其原有结构?

如何在Jest中仅模拟模块的单个类并自动保留其结构?

可以利用Jest的jest.createMockFromModule方法实现需求,它能像自动模拟整个模块那样,为单个类生成保留原有结构的mock,同时保留其他类的真实实现。

解决方案代码

jest.mock('myModule', () => {
  // 获取模块的真实实现
  const actualModule = jest.requireActual('myModule');
  // 自动生成MyClass1的mock,完整保留类的方法结构
  const mockedMyClass1 = jest.createMockFromModule('myModule').MyClass1;
  
  return {
    ...actualModule,
    MyClass1: mockedMyClass1,
  };
});

原理说明

  • jest.createMockFromModule会分析目标模块的结构,自动为类生成对应的mock:构造函数是mock函数,类的原型方法也会被替换为jest mock函数,实例化后会保留原类的方法结构,完全等同于直接调用jest.mock('myModule')时生成的mock效果。
  • 通过jest.requireActual获取模块的真实实现,再替换掉需要mock的类,就能保证其他类(比如MyClass2)使用原有逻辑。

测试验证示例

const { MyClass1, MyClass2 } = require('myModule');

test('MyClass1的方法自动被mock', () => {
  const myClass1Instance = new MyClass1();
  // 验证实例方法是mock函数
  expect(jest.isMockFunction(myClass1Instance.filter)).toBe(true);
  
  // 调用mock方法并验证调用
  myClass1Instance.filter('test');
  expect(myClass1Instance.filter).toHaveBeenCalledWith('test');
});

test('MyClass2保留真实实现', () => {
  const myClass2Instance = new MyClass2();
  // 此处可验证MyClass2的真实业务逻辑
});

为什么之前的写法无效

直接用jest.fn()替换MyClass1时,只会把构造函数变成mock,但不会自动生成类原型上的方法,导致实例是空的mock对象。而jest.createMockFromModule会完整模拟类的原型链和所有方法,无需手动定义每个方法的mock实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 19:18:19