使用 jest nodejs 测试多个文件上传
Test multiple file upload with jest nodejs
我正在使用 NodeJs 构建一个可以上传多个文件的应用程序。下面是我的测试用例,我收到此错误 Argument of type 'string[]' is not assignable to parameter of type 'MultipartValueSingle'.
这是测试用例
it('Create feed (POST)', () => {
const video = path.resolve(__dirname, `../test-files/movie_video.mp4`);
const image = path.resolve(__dirname, `../test-files/thumbnail.jpg`);
const pdfDoc = path.resolve(__dirname, `../test-files/pdf_doc.pdf`);
const multipleFiles : string[] = [video, image, pdfDoc]
return request(app.getHttpServer())
.post('/feed')
.set('content-type', 'application/octet-stream')
.set('Authorization', 'Bearer ' + accessToken)
.field('text', 'Aenean imperdiet. Nam ipsum risus,. Curabitur suscipit suscipit tellus.')
.field('payment_amount', 0)
.attach('postDocs', multipleFiles)
.expect(function (res) {
if (!('message' in res.body) || !('payload' in res.body)) {
throw new Error('Response should contain message and payload.');
} else if (res.body.message !== StatusMessages.Default) {
throw new Error('User not logged in');
}
if (!('user' in res.body.payload)) {
throw new Error('Payload should contain user.');
}
adminAccessToken = res.body.payload.access_token;
});
});
错误信息很明显,您应该多次调用.attach()
附加多个文件。
例如
index.ts
:
import express from 'express';
import multer from 'multer';
const app = express();
const upload = multer();
const cpUpload = upload.fields([{ name: 'video' }, { name: 'image' }, { name: 'pdfDoc' }]);
app.post('/feed', cpUpload, (req, res) => {
console.log(req.files);
console.log(req.body);
res.sendStatus(200);
});
export { app };
index.test.ts
:
import path from 'path';
import request from 'supertest';
import { app } from '.';
describe('69663276', () => {
it('Create feed (POST)', () => {
const video = path.resolve(__dirname, `./movie_video.mp4`);
const image = path.resolve(__dirname, `./thumbnail.jpg`);
const pdfDoc = path.resolve(__dirname, `./pdf_doc.pdf`);
const accessToken = '123';
return request(app)
.post('/feed')
.set('content-type', 'application/octet-stream')
.set('Authorization', 'Bearer ' + accessToken)
.field('text', 'Aenean imperdiet. Nam ipsum risus,. Curabitur suscipit suscipit tellus.')
.field('payment_amount', 0)
.attach('video', video)
.attach('image', image)
.attach('pdfDoc', pdfDoc)
.expect(200);
});
});
测试结果:
PASS examples/69663276/index.test.ts (11.544 s)
69663276
✓ Create feed (POST) (71 ms)
console.log
[Object: null prototype] {
video: [
{
fieldname: 'video',
originalname: 'movie_video.mp4',
encoding: '7bit',
mimetype: 'video/mp4',
buffer: <Buffer >,
size: 0
}
],
image: [
{
fieldname: 'image',
originalname: 'thumbnail.jpg',
encoding: '7bit',
mimetype: 'image/jpeg',
buffer: <Buffer >,
size: 0
}
],
pdfDoc: [
{
fieldname: 'pdfDoc',
originalname: 'pdf_doc.pdf',
encoding: '7bit',
mimetype: 'application/pdf',
buffer: <Buffer >,
size: 0
}
]
}
at examples/69663276/index.ts:9:11
console.log
[Object: null prototype] {
text: 'Aenean imperdiet. Nam ipsum risus,. Curabitur suscipit suscipit tellus.',
payment_amount: '0'
}
at examples/69663276/index.ts:10:11
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 12.795 s
我正在使用 NodeJs 构建一个可以上传多个文件的应用程序。下面是我的测试用例,我收到此错误 Argument of type 'string[]' is not assignable to parameter of type 'MultipartValueSingle'.
这是测试用例
it('Create feed (POST)', () => {
const video = path.resolve(__dirname, `../test-files/movie_video.mp4`);
const image = path.resolve(__dirname, `../test-files/thumbnail.jpg`);
const pdfDoc = path.resolve(__dirname, `../test-files/pdf_doc.pdf`);
const multipleFiles : string[] = [video, image, pdfDoc]
return request(app.getHttpServer())
.post('/feed')
.set('content-type', 'application/octet-stream')
.set('Authorization', 'Bearer ' + accessToken)
.field('text', 'Aenean imperdiet. Nam ipsum risus,. Curabitur suscipit suscipit tellus.')
.field('payment_amount', 0)
.attach('postDocs', multipleFiles)
.expect(function (res) {
if (!('message' in res.body) || !('payload' in res.body)) {
throw new Error('Response should contain message and payload.');
} else if (res.body.message !== StatusMessages.Default) {
throw new Error('User not logged in');
}
if (!('user' in res.body.payload)) {
throw new Error('Payload should contain user.');
}
adminAccessToken = res.body.payload.access_token;
});
});
错误信息很明显,您应该多次调用.attach()
附加多个文件。
例如
index.ts
:
import express from 'express';
import multer from 'multer';
const app = express();
const upload = multer();
const cpUpload = upload.fields([{ name: 'video' }, { name: 'image' }, { name: 'pdfDoc' }]);
app.post('/feed', cpUpload, (req, res) => {
console.log(req.files);
console.log(req.body);
res.sendStatus(200);
});
export { app };
index.test.ts
:
import path from 'path';
import request from 'supertest';
import { app } from '.';
describe('69663276', () => {
it('Create feed (POST)', () => {
const video = path.resolve(__dirname, `./movie_video.mp4`);
const image = path.resolve(__dirname, `./thumbnail.jpg`);
const pdfDoc = path.resolve(__dirname, `./pdf_doc.pdf`);
const accessToken = '123';
return request(app)
.post('/feed')
.set('content-type', 'application/octet-stream')
.set('Authorization', 'Bearer ' + accessToken)
.field('text', 'Aenean imperdiet. Nam ipsum risus,. Curabitur suscipit suscipit tellus.')
.field('payment_amount', 0)
.attach('video', video)
.attach('image', image)
.attach('pdfDoc', pdfDoc)
.expect(200);
});
});
测试结果:
PASS examples/69663276/index.test.ts (11.544 s)
69663276
✓ Create feed (POST) (71 ms)
console.log
[Object: null prototype] {
video: [
{
fieldname: 'video',
originalname: 'movie_video.mp4',
encoding: '7bit',
mimetype: 'video/mp4',
buffer: <Buffer >,
size: 0
}
],
image: [
{
fieldname: 'image',
originalname: 'thumbnail.jpg',
encoding: '7bit',
mimetype: 'image/jpeg',
buffer: <Buffer >,
size: 0
}
],
pdfDoc: [
{
fieldname: 'pdfDoc',
originalname: 'pdf_doc.pdf',
encoding: '7bit',
mimetype: 'application/pdf',
buffer: <Buffer >,
size: 0
}
]
}
at examples/69663276/index.ts:9:11
console.log
[Object: null prototype] {
text: 'Aenean imperdiet. Nam ipsum risus,. Curabitur suscipit suscipit tellus.',
payment_amount: '0'
}
at examples/69663276/index.ts:10:11
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 12.795 s