Вот решение для нового экспресс-валидатора api (v4):
tl; dr: Вы можете использовать это функция:
exports.testExpressValidatorMiddleware = async (req, res, middlewares) => {
await Promise.all(middlewares.map(async (middleware) => {
await middleware(req, res,() => undefined);
}));
};
Это можно назвать как это:
const { validationResult } = require('express-validator/check');
await testExpressValidatorMiddleware(req, res, expressValidatorMiddlewareArray);
const result = validationResult(req);
expect(result....
Эти решения Предположим, у вас есть асинхронная/Await синтаксис доступен. Вы можете использовать библиотеку node-mocks-http для создания объектов и res
.
Пояснение:
Каждый элемент в массиве экспресс-валидатора наносится на маршрут в качестве промежуточного программного обеспечения. Скажем, это ваш массив:
[
check('addresses.*.street').exists(),
check('addresses.*.postalCode').isPostalCode(),
]
Каждая проверка будет загружена как промежуточное программное обеспечение.
Для тестирования промежуточного программного обеспечения нам необходимо реализовать функцию, которая действует аналогично тому, как express реализует промежуточное программное обеспечение.
Быстрое промежуточное программное обеспечение всегда принимает три параметра, объекты запроса и ответа и следующую функцию, которую он должен вызывать (next
по соглашению). Зачем нам нужен next
? Для сценариев, где мы хотим, чтобы наше промежуточное программное обеспечение что-то делало до и после функции продолжения, например.
const loggerMiddleware = (req, res, next) => {
console.log('req body is ' + req.body);
next();
console.log('res status is ' + res.status);
};
Но экспресс-валидатор не делает этого, он просто вызывает next()
когда каждый из его валидаторов закончена. По этой причине нам не нужно беспокоиться об next()
.
Вместо этого мы можем просто запустить каждый из наших в свою очередь, промежуточное программное и передать пустую функцию next
, чтобы избежать TypeError
:
middlewares.map((middleware) => {
middleware(req, res,() => undefined);
});
Но это не будет работать, потому что экспресс-валидатор промежуточного возвращает обещания и мы должны ждать их, чтобы решить ...
middlewares.map(async (middleware) => {
await middleware(req, res,() => undefined);
});
И мы не хотим, чтобы двигаться дальше, пока все обещания в нашей итерации не будут решены (Mozilla документы на Promise.all
являются here):
await Promise.all(middlewares.map(async (middleware) => {
await middleware(req, res,() => undefined);
}));
И мы должны извлечь это как многоразовые функции:
exports.testExpressValidatorMiddleware = async (req, res, middlewares) => {
await Promise.all(middlewares.map(async (middleware) => {
await middleware(req, res,() => undefined);
}));
};
И теперь мы пришли на моем решении. Если кто-то может улучшить эту реализацию, я очень рад внести изменения.