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

如何在Jest中Mock类的静态方法?

Mocking Static Methods of a Class in Jest

当然可以实现mock类的静态方法!你已经搞定了实例方法的mock,其实只需要在现有逻辑上稍作调整——因为在JavaScript里,类本身就是一个函数,静态方法本质是挂在这个函数对象上的属性,所以我们直接给mock出来的类函数添加静态方法的定义就行。

调整后的完整Mock方案

我们可以在创建的mock类函数上直接挂载静态方法的mock实现,具体代码如下:

import A from '../src/a';
import B from '../src/b';

jest.mock('../src/a', () => {
  // 创建mock类的构造函数,同时定义实例方法的mock
  const mockA = jest.fn().mockImplementation(() => {
    return { f: () => 'mockedA.f()' };
  });

  // 给mock类添加静态方法staticF的mock实现
  mockA.staticF = jest.fn().mockReturnValue('mockedA.staticF()');

  return mockA;
});

describe('B', () => {
  it('should mock instance method f of A correctly', () => {
    const b = new B();
    const result = b.g();
    expect(result).toBe('mockedA.f()');
    // 额外验证A的构造函数被调用过
    expect(A).toHaveBeenCalled();
  });

  it('should mock static method staticF of A correctly', () => {
    const b = new B();
    const result = b.gCallsStaticF();
    expect(result).toBe('mockedA.staticF()');
    // 验证静态方法被调用过
    expect(A.staticF).toHaveBeenCalled();
  });
});

关键逻辑说明

  1. 我们先创建mockA这个Jest mock函数,用来模拟类A的构造函数,通过mockImplementation定义实例化后返回的对象(也就是实例方法的mock)。
  2. 直接给mockA添加staticF属性,赋值为一个Jest mock函数,并通过mockReturnValue指定它的返回值——这样当B中调用A.staticF()时,就会触发我们定义的mock逻辑。

动态修改静态方法返回值(可选)

如果需要在单个测试用例里临时修改静态方法的返回值,也可以直接在测试中调整:

it('should change static method return value dynamically', () => {
  // 临时替换静态方法的返回值
  A.staticF.mockReturnValue('temporary mocked value');
  const b = new B();
  expect(b.gCallsStaticF()).toBe('temporary mocked value');
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:38:52