如何在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(); }); });
关键逻辑说明
- 我们先创建
mockA这个Jest mock函数,用来模拟类A的构造函数,通过mockImplementation定义实例化后返回的对象(也就是实例方法的mock)。 - 直接给
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
相关产品推荐
相关产品推荐

