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

Vitest中无法Mock静态方法:报错‘is not a function’

解决Vitest中Mock静态类方法的问题

问题出在你对StaticPerson的Mock方式上:你用vi.fn()把它模拟成了一个构造函数,返回的是带有实例方法的对象,但getAge是StaticPerson的静态方法,它直接属于类本身,不是实例的属性,所以调用StaticPerson.getAge()会提示“不是函数”。

正确的Mock方式

不需要把StaticPerson包装成构造函数,直接定义一个包含静态方法的对象即可:

it("return mocked age from static method", () => {
  vi.mock("./person", () => ({
    StaticPerson: {
      getAge: vi.fn(() => 15)
    }
  }));

  const interviewer = new Interviewer();
  const age: number = interviewer.askStaticAge();

  expect(age).toBe(15);
  // 可选:验证静态方法是否被调用
  expect(StaticPerson.getAge).toHaveBeenCalled();
});

同时Mock多个导出的情况

如果需要在同一个测试里同时MockPerson和StaticPerson,可以这样写:

it("mock both Person and StaticPerson", () => {
  vi.mock("./person", () => ({
    Person: vi.fn(() => ({
      getAge: vi.fn(() => 15)
    })),
    StaticPerson: {
      getAge: vi.fn(() => 25)
    }
  }));

  const interviewer = new Interviewer();
  expect(interviewer.askAge()).toBe(15);
  expect(interviewer.askStaticAge()).toBe(25);
});

关键原理

  • 对于普通类(非静态),我们Mock的是它的构造函数,让构造函数返回带有模拟实例方法的对象;
  • 对于静态类的静态方法,我们直接Mock这个类对象本身,把静态方法定义为模拟函数即可——因为静态方法是挂载在类这个对象上的,而不是类的实例上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 08:57:44