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

如何使用Jest模拟类的静态只读字段以通过测试?

解决Jest模拟类时静态只读字段未定义的问题

问题出在你当前的Jest Mock实现上:你只替换了RealClass的构造函数逻辑,但没有把MockClass的静态字段挂载到被Mock的RealClass对象上,导致Client类中访问RealClass.StaticReadonlyField时拿到undefined。

修复方案

需要在Mock构造函数上同步MockClass的静态属性,确保Client能正确访问到静态字段:

  1. 保持MockClass的定义(确保包含所有需要的静态只读字段)
  2. 修改Jest Mock的实现,将MockClass的静态属性挂载到Mock构造函数上

修改后的代码示例:

class MockClass extends SomeOtherRealClass {
  static readonly StaticReadonlyField: 0;
  static readonly StaticReadonlyField1: 1; // 同步RealClass的所有静态字段

  somePublicField = MockClass.StaticReadonlyField;

  constructor(){
    super();
  }
}

jest.mock('RealModule', () => {
  // 创建Mock构造函数
  const mockRealClass = jest.fn().mockImplementation(() => {
    return new MockClass();
  });

  // 将MockClass的静态属性全部复制到Mock构造函数上
  Object.assign(mockRealClass, MockClass);

  return {
    RealClass: mockRealClass
  };
});

关键说明

Client类中直接访问的是导入的RealClass的静态属性,而你之前的Mock只替换了实例创建逻辑,没有处理静态属性。通过Object.assign把MockClass的静态字段同步到Mock构造函数后,Client里的RealClass.StaticReadonlyField就能拿到正确的0值,测试用例也会正常通过。

如果使用TypeScript,为了避免类型报错,可以给Mock构造函数添加类型断言:

const mockRealClass = jest.fn().mockImplementation(() => new MockClass()) as typeof RealClass;
Object.assign(mockRealClass, MockClass);

验证测试用例

现在你的测试用例可以正常执行:

it('should set public field correctly', () => {
  const classToTest = new Client();
  
  (classToTest as any).containedClass.somePublicField = MockClass.StaticReadonlyField;
  
  expect(classToTest.funcToTest()).toBeTruthy();
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 11:02:44