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

如何用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);
  });
});

额外说明

  1. 针对特定实例设置:如果已经拿到了类的实例(比如从mock.instances中获取),也可以直接给该实例的方法设置返回值:

    const mockInstance = MockedCalculatorService.mock.instances[0];
    mockInstance.add.mockReturnValue(7);
    

    这种方式适合需要对单个实例定制行为的场景。

  2. 复杂逻辑模拟:如果需要更复杂的返回逻辑(比如根据参数返回不同值),可以使用mockImplementation():

    MockedCalculatorService.prototype.add.mockImplementation(() => 5);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:10:51