如何用Jest的MockedClass为ES6类方法逐测试设置模拟返回值?
使用Jest的
MockedClass为类方法单独设置模拟返回值 当你用jest.mock()自动模拟ES6类后,MockedClass的原型(prototype)上的所有方法都会被Jest替换为mock函数。你可以在单个测试用例中直接修改这些mock函数的行为,完全不需要全局模拟,具体实现如下:
核心实现方式
通过MockedCalculatorService.prototype.add访问类原型上的mock方法,调用mockReturnValue()(或mockImplementation())来定制返回值,该设置仅对当前测试用例生效。
完整测试示例
import CalculatorService from 'services/calculatorService'; jest.mock('services/calculatorService'); // 类型断言为MockedClass,获得完整的mock类型支持 const MockedCalculatorService = CalculatorService as jest.MockedClass<typeof CalculatorService>; describe('CalculatorService Tests', () => { // 最佳实践:每个测试前重置mock,避免测试间污染 beforeEach(() => { MockedCalculatorService.prototype.add.mockReset(); }); test('add方法无论输入什么都返回5', () => { // Arrange:设置当前测试用例中所有新实例的add方法返回5 MockedCalculatorService.prototype.add.mockReturnValue(5); // Act:执行依赖CalculatorService的逻辑 const result = implementation(1, 2); // 假设该函数内部会实例化CalculatorService并调用add // Assert:验证返回值和调用情况 expect(result).toBe(5); const mockInstance = MockedCalculatorService.mock.instances[0]; expect(mockInstance.add).toHaveBeenCalledWith(1, 2); }); test('另一个测试用例设置不同的返回值', () => { // Arrange:为当前测试设置独立的返回值 MockedCalculatorService.prototype.add.mockReturnValue(10); // Act const result = implementation(3, 4); // Assert expect(result).toBe(10); expect(MockedCalculatorService.mock.instances[0].add).toHaveBeenCalledWith(3, 4); }); });
额外说明
针对特定实例设置:如果已经拿到了类的实例(比如从
mock.instances中获取),也可以直接给该实例的方法设置返回值:const mockInstance = MockedCalculatorService.mock.instances[0]; mockInstance.add.mockReturnValue(7);这种方式适合需要对单个实例定制行为的场景。
复杂逻辑模拟:如果需要更复杂的返回逻辑(比如根据参数返回不同值),可以使用
mockImplementation():MockedCalculatorService.prototype.add.mockImplementation(() => 5);
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

