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

Webpack5 ModuleFederationPlugin:为特定测试覆写Jest Mock

解决Jest中覆写联邦模块全局Mock的问题

你遇到的核心问题是重复调用jest.mock会完全替换整个模块的Mock实现,导致其他组件的全局Mock丢失。要在单个测试用例中覆写特定组件的Mock,无需重新创建模块Mock,直接修改已存在的全局Mock即可,以下是两种可行方案:

方案一:使用jest.spyOn覆写单个组件

这种方式更符合Jest的Mock最佳实践,能自动跟踪原Mock状态,方便后续恢复。

// 导入联邦模块(Jest会自动替换为全局Mock)
import * as MyFedModule from 'MyFedModule';

describe('你的测试套件名称', () => {
  test('覆写component1的Mock实现', () => {
    // 监听component1并覆写返回值
    const component1Spy = jest.spyOn(MyFedModule, 'component1')
      .mockReturnValue('Overridden Component1 Mock');

    // 这里执行你的测试逻辑,比如渲染依赖component1的组件
    // ...

    // 测试完成后恢复原全局Mock,避免影响其他测试用例
    component1Spy.mockRestore();
  });

  test('使用原全局Mock的用例', () => {
    // 此时component1会回到全局定义的'Mock',无需额外操作
    expect(MyFedModule.component1()).toBe('Mock');
  });
});

方案二:直接修改Mock模块的属性

如果你的Mock是对象形式,可以直接修改对应属性来覆写,适合简单场景:

import * as MyFedModule from 'MyFedModule';

describe('你的测试套件名称', () => {
  test('覆写component2的Mock实现', () => {
    // 先保存原Mock实现,用于后续恢复
    const originalComponent2 = MyFedModule.component2;
    
    // 直接替换为新的Mock函数
    MyFedModule.component2 = () => 'Custom Component2 Mock';

    // 执行测试逻辑
    // ...

    // 测试结束后恢复原Mock
    MyFedModule.component2 = originalComponent2;
  });
});

关键注意点

  • 不要在测试文件中重复调用jest.mock('MyFedModule', ...),这会完全覆盖全局Mock,导致其他组件的Mock丢失。
  • 无论用哪种方案,测试完成后都要恢复原Mock,避免污染其他测试用例的执行环境。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:05:40