node.js - 有没有办法将二进制文件输入(流?)直接提供给 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');
})
先感谢您。
解决方案
所以你想做一个集成测试但没有 HTTP 的东西。根据提供的代码,仅req.body
使用。在单元测试方面,模拟这样Request
的 . 但我们不“知道”如何multer
使用Request
和Response
。因此,如果您仍想进行集成测试,那么您的方法就足够了。最好是通过{ body: { videoId: fakeId } }
而不是Request
模拟multer
,multer.diskStorage
和and
multer.single 。
推荐阅读
- python - 删除和/或更新系统的 Python 时虚拟环境的后果
- eclipse - Tomcat8 无法通过 Eclipse 启动
- firebase - 添加带有脚本标签的firebase ui
- json - 与spring数据jpa的自引用关系
- r - 在 VEGAN 包中调用函数 ordiellipse 时出现 pts 错误:下标越界
- java - 添加 spring-boot-admin-starter-client 依赖项后无法解析占位符
- swift - 无法分配来自 UITextInputTraits 的属性
- odoo-12 - 验证约束字段“文件”时出错不存在
- dart - 对象实例化语法,ClassName() 与 new ClassName()
- javascript - 如何使用 Underscore.js 库重写此函数?