如何使用Jest模拟类的静态只读字段以通过测试?
解决Jest模拟类时静态只读字段未定义的问题
问题出在你当前的Jest Mock实现上:你只替换了RealClass的构造函数逻辑,但没有把MockClass的静态字段挂载到被Mock的RealClass对象上,导致Client类中访问RealClass.StaticReadonlyField时拿到undefined。
修复方案
需要在Mock构造函数上同步MockClass的静态属性,确保Client能正确访问到静态字段:
- 保持
MockClass的定义(确保包含所有需要的静态只读字段) - 修改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
相关产品推荐
相关产品推荐

