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

Jest如何针对单个测试用例自定义mock multer第三方默认导出

解决方法

1 修改全局multer mock为可动态调整的版本

你原来的mock逻辑是写死在工厂函数里的,初始化后就无法修改,需要把核心的multer中间件逻辑抽成可被jest控制的mock函数:

// 先声明可被修改的mock中间件变量
let mockMulterSingleMiddleware: jest.Mock;

jest.mock('multer', () => {
  const m = () => ({
    single: () => {
      // 把中间件指向我们声明的可修改mock函数
      mockMulterSingleMiddleware = jest.fn((req: Request, res: Response, next: NextFunction) => {
        // 默认实现可以留空,或者按通用情况写
        next();
      });
      return mockMulterSingleMiddleware;
    },
  });
  m.memoryStorage = () => jest.fn();
  return m;
});

2 新增用例前置钩子重置mock,避免互相影响

在describe块内新增beforeEach,每次执行用例前重置mock的实现和调用记录:

describe('POST /api/v1/garment/image/upload', () => {
  beforeEach(() => {
    mockMulterSingleMiddleware.mockReset();
  });

  // 测试用例写在此处
})

3 为单个用例自定义mock实现

分别给两个测试用例配置对应的multer中间件逻辑:

it('should return 201', async () => {
  // 配置正常传文件的mock逻辑
  mockMulterSingleMiddleware.mockImplementation((req, res, next) => {
    req.body = { type: 'screenshots' };
    req.file = mockFile;
    next();
  });

  await request(app)
    .post('/api/v1/garment/image/upload')
    .send({ file: 'myImage' })
    .expect(201);
});

it('should return 400', async () => {
  // 配置无文件的mock逻辑,触发业务侧参数校验失败返回400
  mockMulterSingleMiddleware.mockImplementation((req, res, next) => {
    req.body = {};
    req.file = undefined;
    next();
  });

  await request(app)
    .post('/api/v1/garment/image/upload')
    .send()
    .expect(400);
});

如果你的400错误是multer本身抛出的参数错误,也可以直接在第二个用例的mock实现里抛出对应错误,交由你的错误处理中间件返回400即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:15:02