На самом деле, если вы действительно ищете, там действительно много ссылок.
Далее я поделюсь несколькими известными мне способами.
Одним из главных концептуальных скачков в тестировании приложений Express с помощью имитации запроса / ответа является понимание того, как имитировать цепочку
API например. res.status(200).json({ foo: 'bar' })
.
Сначала вы можете создать какой-нибудь перехватчик, это достигается возвращением экземпляра res из каждого из его методов:
// util/interceptor.js
module.exports = {
mockRequest: () => {
const req = {}
req.body = jest.fn().mockReturnValue(req)
req.params = jest.fn().mockReturnValue(req)
return req
},
mockResponse: () => {
const res = {}
res.send = jest.fn().mockReturnValue(res)
res.status = jest.fn().mockReturnValue(res)
res.json = jest.fn().mockReturnValue(res)
return res
},
// mockNext: () => jest.fn()
}
Экспресс API пользовательского пространства основан на промежуточном программном обеспечении. Промежуточное программное обеспечение, которое принимает в качестве параметров запрос (обычно называемый req), ответ (обычно называемый res) и следующий (вызов промежуточного программного обеспечения next).
И тогда у вас есть такой контроллер:
// todoController.js
function todoController (req, res) {
if (!req.params.id) {
return res.status(404).json({ message: 'Not Found' });
}
res.send('Hello i am todo controller')
}
Они используются при «подключении» к экземпляру приложения (приложения) Express (в app.js):
// app.js
const express = require('express');
const app = express();
const todoController = require('./todoController');
app.get('/todo', todoController);
Используя mockRequest и mockResponse, которые мы определили ранее, мы предположим, что res.send()
вызывается с правильной полезной нагрузкой ({ data })
.
Итак, в вашем тестовом файле:
// todo.spec.js
const { mockRequest, mockResponse } = require('util/interceptor')
const controller = require('todoController.js')
describe("Check method \'todoController\' ", () => {
test('should 200 and return correct value', async () => {
let req = mockRequest();
req.params.id = 1;
const res = mockResponse();
await controller.todoController(req, res);
expect(res.send).toHaveBeenCalledTimes(1)
expect(res.send.mock.calls.length).toBe(1);
expect(res.send).toHaveBeenCalledWith('Hello i am todo controller');
});
test('should 404 and return correct value', async () => {
let req = mockRequest();
req.params.id = null;
const res = mockResponse();
await controller.todoController(req, res);
expect(res.status).toHaveBeenCalledWith(404);
expect(res.json).toHaveBeenCalledWith({ message: 'Not Found' });
});
});
Это всего лишь один подход к тестированию обработчиков Express и промежуточного программного обеспечения. Альтернатива - запустить сервер Express.