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
相关产品推荐
相关产品推荐

