Есть ли способ обслуживать ввод двоичного файла (поток?) Непосредственно промежуточному программному обеспечению multer (для целей модульного тестирования)? - PullRequest
1 голос
/ 02 августа 2020

Я пытаюсь написать тестовые коды для 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');
})

Заранее спасибо.

1 Ответ

0 голосов
/ 02 августа 2020

Итак, вы хотите провести интеграционный тест, но без HTTP. Согласно предоставленному коду используется только req.body. Что касается модульного тестирования, то такой Request просто имитировать. Но мы не «знаем», как multer использует Request и Response. Так что, если вы все же хотите провести интеграционный тест, ваш подход достаточно хорош. В противном случае лучше передать { body: { videoId: fakeId } } вместо Request и имитировать multer, multer.diskStorage и and multer.single`.

...