如何用 supertest 模拟 multer?
How to mock multer with supertest?
我正在编写文件上传 API 并且在模拟 multer 时遇到了一些麻烦。我正在尝试使用 supertest 测试我的端点。
it('load image', async () => {
await app
.post(`${apiImage}`)
.set('Authorization', 'abc123')
.attach('avatar', `${__dirname}/test.jpg`);
.expect(200);
});
上传工作正常。但是每次我 运行 测试时,都会创建新文件。那么,如何模拟 multer 而不是每次都创建新文件?
我有一个中间件助手可以像这样包装 multer
// middleware/index.js
const multer = require('multer');
exports.multerUpload = () => multer({...});
然后像这样在我的路线中使用它
// routes.js
const { multerUpload } = require('path/to/middlewares');
app.post('/upload', multerUpload().any());
然后,在我的测试中,我可以停止 multerUpload
// test.js
const middlewares = require('path/to/middlewares');
sinon.stub(middlewares, 'multerUpload').callsFake(
() => {
return {
any() {
return (req, res, next) => {
// You can do whatever you like to the request body here e.g
req.body = { title: req.query.title };
req.files = [{ location: 'sample.url', key: 'sample.key' }];
return next();
};
},
};
},
);
使用 Jest 模拟 Multer(类似于上面的答案,但使用 Jest)
App.js
使用 multer 作为中间件
const app = express();
app.use()
app.use(multer({ dest: FILE_UPLOAD_PATH }).single('datafile'));
app.use('/api', apiRoutes);
apiRoute.js
router.post('/datasources', async function (req, res) {
...
});
apiRoute.test.js
const multer = require('multer');
jest.mock('multer');
multer.mockImplementation(() => {
return {
single() {
return (req, res, next) => {
req.body = { title: req.query.title };
req.file = [{ originalname: 'sample.name', mimetype: 'sample.type', path: 'sample.url' }];
return next();
};
},
};
});
.
.
.
我正在编写文件上传 API 并且在模拟 multer 时遇到了一些麻烦。我正在尝试使用 supertest 测试我的端点。
it('load image', async () => {
await app
.post(`${apiImage}`)
.set('Authorization', 'abc123')
.attach('avatar', `${__dirname}/test.jpg`);
.expect(200);
});
上传工作正常。但是每次我 运行 测试时,都会创建新文件。那么,如何模拟 multer 而不是每次都创建新文件?
我有一个中间件助手可以像这样包装 multer
// middleware/index.js
const multer = require('multer');
exports.multerUpload = () => multer({...});
然后像这样在我的路线中使用它
// routes.js
const { multerUpload } = require('path/to/middlewares');
app.post('/upload', multerUpload().any());
然后,在我的测试中,我可以停止 multerUpload
// test.js
const middlewares = require('path/to/middlewares');
sinon.stub(middlewares, 'multerUpload').callsFake(
() => {
return {
any() {
return (req, res, next) => {
// You can do whatever you like to the request body here e.g
req.body = { title: req.query.title };
req.files = [{ location: 'sample.url', key: 'sample.key' }];
return next();
};
},
};
},
);
使用 Jest 模拟 Multer(类似于上面的答案,但使用 Jest)
App.js
使用 multer 作为中间件
const app = express();
app.use()
app.use(multer({ dest: FILE_UPLOAD_PATH }).single('datafile'));
app.use('/api', apiRoutes);
apiRoute.js
router.post('/datasources', async function (req, res) {
...
});
apiRoute.test.js
const multer = require('multer');
jest.mock('multer');
multer.mockImplementation(() => {
return {
single() {
return (req, res, next) => {
req.body = { title: req.query.title };
req.file = [{ originalname: 'sample.name', mimetype: 'sample.type', path: 'sample.url' }];
return next();
};
},
};
});
.
.
.