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

如何阻止Jest中被Mock的函数在共享包内部被非Mock调用

解决Lerna共享包中Jest Mock parseMultipartBody不生效的问题

以下是几种无需Mock通用处理器的解决方案,按实用性排序:

  • 直接Mock共享包中的目标方法
    由于Lerna管理的共享包是独立模块,全局Jest配置的Mock可能无法穿透到包内部调用。直接针对共享包的模块路径Mock,就能覆盖所有调用场景:

    // 在测试文件顶部添加
    jest.mock('@your-org/shared-utils', () => {
      // 保留其他原方法的实现
      const original = jest.requireActual('@your-org/shared-utils');
      return {
        ...original,
        // 替换parseMultipartBody为Mock函数
        parseMultipartBody: jest.fn(() => Promise.resolve({
          fields: {},
          files: []
        }))
      };
    });
    
  • 用spyOn动态替换方法实现
    如果parseMultipartBody是共享包导出的独立方法,可以在测试周期内临时替换它,测试结束后恢复原实现:

    import { parseMultipartBody } from '@your-org/shared-utils';
    
    beforeEach(() => {
      // 替换方法为Mock实现
      jest.spyOn(parseMultipartBody, 'default').mockResolvedValue({
        fields: {},
        files: []
      });
    });
    
    afterEach(() => {
      // 恢复原方法,避免影响其他测试
      jest.restoreAllMocks();
    });
    
  • 通过moduleNameMapper全局映射Mock
    在Jest配置文件中,把共享包的目标模块映射到本地Mock文件,实现全局生效:

    1. 修改jest.config.js:
      module.exports = {
        // 其他配置项
        moduleNameMapper: {
          // 匹配共享包中parseMultipartBody的路径
          '^@your-org/shared-utils/parseMultipartBody$': '<rootDir>/__mocks__/parseMultipartBody.js'
        }
      };
      
    2. 在项目根目录创建__mocks__/parseMultipartBody.js:
      module.exports = jest.fn(() => Promise.resolve({
        fields: {},
        files: []
      }));
      
  • 给测试请求补全Content-Type头
    如果不想Mock方法,直接在测试请求中添加符合要求的Content-Type头,满足方法的校验逻辑:

    // 假设使用supertest测试路由
    const request = require('supertest');
    const app = require('../app');
    
    test('调用通用处理器路由', async () => {
      await request(app)
        .post('/your-route-path')
        .set('Content-Type', 'multipart/form-data')
        .send(/* 你的请求数据 */)
        .expect(200);
    });
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:40:11