我正在嘗試express使用jest和測驗控制器supertest。我有一個處理檔案處理的中間件multer。我可以multer在全球范圍內模擬,但我一直無法在每個it/test案例中模擬它。
// saveImage.controller.ts
jest.mock('multer', () => {
const m = () => ({
single: () => (req: Request, res: Response, next: NextFunction) => {
req.body = { type: 'screenshots' };
req.file = mockFile;
return next();
},
});
m.memoryStorage = () => jest.fn();
return m;
});
describe('POST /api/v1/garment/image/upload', () => {
it('should return 201', async () => {
await request(app)
.post('/api/v1/garment/image/upload')
.send({ file: 'myImage' }) // this is overwritten by the mock
.expect(201); // passes
});
it('should return 400', async () => {
await request(app)
.post('/api/v1/garment/image/upload')
.send() // this is overwritten by the mock
.expect(400); // fails
});
});
第一個測驗通過,但我無法更改模擬以通過第二個測驗。如何在我的第二種it情況下更改模擬?
uj5u.com熱心網友回復:
我將使用jest.doMock(moduleName, factory, options)來模擬multer。注意這個multer.single()方法會在模塊匯入的時候執行,所以我們在模塊匯入之前mock一下。
為了在模塊匯入時清除快取(可以快取模塊作用域變數、函式的函式等),需要jest.resetModules()在運行每個測驗用例之前使用。
app.ts:
import express from 'express';
import multer from 'multer';
import path from 'path';
const upload = multer({ dest: path.join(__dirname, 'uploads/') });
const app = express();
app.post('/api/v1/garment/image/upload', upload.single('file'), (req, res) => {
console.log(req.file, req.body);
if (req.file) {
res.sendStatus(201);
} else {
res.sendStatus(400);
}
});
export { app };
app.test.ts:
import request from 'supertest';
import multer from 'multer';
import { NextFunction, Request, Response } from 'express';
describe('69997349', () => {
let app: typeof import('./app').app;
beforeEach(async () => {
jest.resetModules();
});
it('should return 201', async () => {
const mockFile = { fieldname: 'myImage' } as Express.Multer.File;
jest.doMock('multer', () => {
const m = () => ({
single: () => (req: Request, res: Response, next: NextFunction) => {
req.body = { type: 'screenshots' };
req.file = mockFile;
return next();
},
});
return m;
});
app = (await import('./app')).app;
await request(app).post('/api/v1/garment/image/upload').send({ file: 'myImage' }).expect(201);
});
it('should return 400', async () => {
jest.doMock('multer', () => {
const m = () => ({
single: () => (req: Request, res: Response, next: NextFunction) => {
return next();
},
});
return m;
});
app = (await import('./app')).app;
await request(app).post('/api/v1/garment/image/upload').expect(400);
});
});
測驗結果:
PASS examples/69997349/app.test.ts (8.245 s)
69997349
? should return 201 (297 ms)
? should return 400 (23 ms)
console.log
{ fieldname: 'myImage' } { type: 'screenshots' }
at examples/69997349/app.ts:10:11
console.log
undefined undefined
at examples/69997349/app.ts:10:11
Test Suites: 1 passed, 1 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 9.428 s, estimated 10 s
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/359506.html
