单元测试 express-validator 中间件

Unit test express-validator middleware

我有以下 express-validator 中间件代码要测试

//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)
});

我试图通过直接访问 'anyValidator' 中间件来创建测试代码(使用 Jest)。但是测试没有用。测试总是 return 'next()' 尽管我发送了空体(它应该 return res.status(422))。

对上述 express-validator 中间件进行单元测试的最佳方法是什么 (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]表示访问第三个元素validator中的函数(req, res, next)

谢谢大家的帮助。我已经解决了这个问题。我意识到我只需要测试验证器排除函数(req、res、next)的所有对象。之后,我们 运行 validator 的最后一个对象是 function(req, res, next) ,其参数为 req 和 res 来自先前对所有 validator 对象的测试。

下面是解决方案的代码:

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 作为测试框架。

如果有更好的解决办法,欢迎评论我的回答或者回答问题。谢谢