Промежуточное ПО для экспресс-проверки модулей - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть следующий код промежуточного программного обеспечения экспресс-валидатора для тестирования

//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) в валидаторе, который является третьим элементом.

1 Ответ

0 голосов
/ 22 февраля 2019

Спасибо за помощь.Я решил проблему.Я понял, что мне просто нужно протестировать все объекты функции исключения валидатора (req, res, next).После этого мы запускаем последний объект валидатора, который является функцией (req, res, next) с параметром req и res из предыдущего теста всех объектов валидатора.

Ниже приведен код решения:

const validatorTester = async (validatorArr, mockReq, mockRes, mockNext) => {
  const next = jest.fn();
  for (let i = 0; i < validatorArr.length - 1; i++) {
    await validatorArr[i](mockReq, mockRes, next);
  }

  await validatorArr[validatorArr.length - 1](mockReq, mockRes, mockNext);

  return [mockReq, mockRes, mockNext];
};

Примечание: я использую Jest в качестве основы тестирования.

Если есть какое-либо лучшее решение, позвольте прокомментировать мой ответ или ответить на вопрос.Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...