首页 > 解决方案 > 有没有办法将二进制文件输入(流?)直接提供给 multer 中间件(用于单元测试目的)?

问题描述

我正在尝试在 multer 和我的服务上编写测试代码。

由于 multer 是 express 的中间件,multer 旨在处理来自客户端的请求并自动处理文件并将其放入req.file.

但我想知道是否有任何方法不发出真正的 HTTP 请求,将二进制文件或流传递给 multer 中间件,以便我可以检查文件是否正确保存在本地磁盘中,或者文件的大小是否在req.file.

我作为 multer 的中间件模块的代码如下,仅供参考:

import { Request, Response, NextFunction } from 'express';
import multer from 'multer';

const multerMiddleware = (dest: string) => (req: Request, res: Response, next: NextFunction) => {
  const upload = multer({
    storage: multer.diskStorage({
      destination: dest,
      filename: (req, file, cb) => {
        const { videoId } = req.body;
        const filename = `${videoId}-${file.originalname}`;
        cb(null, filename);
      }
    })
  });

  upload.single('file')(req, res, next);
}

export default multerMiddleware;

或者,在 Express 应用程序中创建一个测试目的路线并使用它进行测试是最好的方法吗?如下所示:

app.post('/testMulter', multerMiddleware('temp/'), (req, res, next) => {
  res.status(200);
  res.json(req.file);
  // ...
});

// in test codes
import request from 'supertest'
import App from '../app.ts'

it('multer middleware download files well', async (done) => {
  const app = new App.app;

  const response = await request(app)
    .post('/testMulter')
    .attach('file', './test.mp4');
  expect(response.file.filename).toBe('test.mp4');
})

先感谢您。

标签: node.jstypescriptjestjsmultipartform-datasupertest

解决方案


所以你想做一个集成测试但没有 HTTP 的东西。根据提供的代码,仅req.body使用。在单元测试方面,模拟这样Request的 . 但我们不“知道”如何multer使用RequestResponse。因此,如果您仍想进行集成测试,那么您的方法就足够了。最好是通过{ body: { videoId: fakeId } }而不是Request模拟multer,multer.diskStorageand multer.single 。


推荐阅读