如何阻止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文件,实现全局生效:- 修改jest.config.js:
module.exports = { // 其他配置项 moduleNameMapper: { // 匹配共享包中parseMultipartBody的路径 '^@your-org/shared-utils/parseMultipartBody$': '<rootDir>/__mocks__/parseMultipartBody.js' } }; - 在项目根目录创建
__mocks__/parseMultipartBody.js:module.exports = jest.fn(() => Promise.resolve({ fields: {}, files: [] }));
- 修改jest.config.js:
给测试请求补全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
相关产品推荐
相关产品推荐

