У меня есть следующий код промежуточного программного обеспечения экспресс-валидатора для тестирования
//validator.js
const {body, validationResult, param} = require('express-validator/check');
exports.anyValidator = [
body('first_body')
.exists()
.withMessage('any error message'),
body('second_body')
.exists()
.withMessage('any error message'),
body('third_body')
.exists()
.withMessage('any error message'),
function(req, res, next) {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(422).json({errors: errors.mapped()});
}
next();
},
];
Пример использования валидатора в маршрутизаторе
//router.js
const router = require('express').Router();
const vld = require('../middlewares/validator');
const url = './path
router.post(url, vld.anyValidator, (req, res) => {
res.status(201)
});
Я попытался создать тестовый код (используя Jest)путем прямого доступа к промежуточному программному обеспечению anyValidator.Но тест не сработал.Тест всегда возвращает 'next ()', хотя я отправляю пустое тело (оно должно возвращать res.status (422)).
Какой наилучший способ для модульного тестирования промежуточного программного обеспечения экспресс-валидатора выше (validator.js)?
Тестовый код
//validator.unit.test.js
const httpMocks = require('node-mocks-http');
const sinon = require('sinon');
const vld = require('../analytics');
describe('Testing validator', () => {
describe('anyValidator test', () => {
let reqMocks;
let resMocks;
let nextMocks;
beforeEach(() => {
reqMocks = httpMocks.createRequest({body: {}});
resMocks = httpMocks.createResponse();
nextMocks = sinon.spy();
});
it('Test', async (done) => {
await vld.anyValidator[3](reqMocks, resMocks, nextMocks);
console.log(nextMocks.calledOnce); //it should return false
done();
});
});
});
Примечание: vld.anyValidator [3] означает доступ к функции (req, res, next) в валидаторе, который является третьим элементом.