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

如何Mock更新同一对象的类方法并复用同一对象?

让Mock的methodA和methodB共享同一对象的解决方案

这当然可行!核心思路就是让两个Mock方法操作同一个对象引用,而不是各自返回独立的对象(哪怕内容完全一致)。这样methodB对对象的修改会直接反映在methodA返回的对象上,你就能写出expect(obj.value).toEqual(200)这种有实际验证意义的断言了。

具体实现步骤

  1. 定义一个共享的基准对象:所有Mock方法都围绕这个对象进行操作,确保它们指向内存中的同一个实例。
  2. 配置methodA的Mock:让它直接返回这个共享对象(如果原方法是返回函数,则返回一个指向该对象的函数)。
  3. 配置methodB的Mock:不要让它返回新对象,而是模拟真实业务逻辑,直接修改共享对象的属性,再返回它(保持和原方法的返回行为一致)。

代码示例

// 定义共享对象,每次测试前重置它的状态避免污染
let sharedObj;

beforeEach(() => {
  // 重置所有Mock,保证测试隔离
  jest.clearAllMocks();
  
  // 初始化共享对象,恢复初始状态
  sharedObj = { value: 100, text: "Hello" };

  // Mock methodA:返回共享对象(如果原methodA是返回函数,就用mockReturnValue(() => sharedObj))
  myModule1.methodA.mockReturnValue(sharedObj);

  // Mock methodB:模拟真实逻辑,修改共享对象的value属性后返回
  myModule2.methodB.mockImplementation(() => {
    sharedObj.value = 200;
    return sharedObj;
  });
});

// 测试用例
test('methodB correctly updates the object returned by methodA', () => {
  // 调用待测试类中同时调用methodA和methodB的方法
  const testedInstance = new YourTestedClass();
  testedInstance.targetMethod();

  // 断言共享对象的value被成功修改
  expect(sharedObj.value).toEqual(200);
});

关键原理说明

JavaScript中对象是引用类型,当methodA返回sharedObj时,它返回的是该对象在内存中的引用地址。methodB的Mock逻辑直接修改这个引用指向的对象属性,自然会影响到所有持有该引用的变量——包括你在断言时检查的sharedObj。

额外注意事项

  • 务必在每个测试前重置共享对象的状态(比如在beforeEach里重新初始化),否则上一个测试的修改会影响后续测试,导致用例污染。
  • 如果原methodB的逻辑是接收对象参数并修改,那你的Mock也要对应调整,确保它操作的是methodA返回的那个对象引用,而不是新对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:43:29