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
相关产品推荐
相关产品推荐

