单元测试快速验证器中间件

时间:2019-02-22 03:47:25

标签: node.js express jestjs sinon express-validator

我有以下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)。但是测试没有用。尽管我发送了空的正文,但测试始终返回“ next()”(它应该返回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]表示要访问验证器中的函数(req,res,next),这是第三个元素。

1 个答案:

答案 0 :(得分:0)

感谢您的所有帮助。我已经解决了问题。我意识到我只需要测试验证器排除功能(req,res,next)的所有对象。之后,我们运行带有参数req和res的最后一个验证器对象,即function(req,res,next),来自所有验证器对象的先前测试。

下面是解决方案的代码:

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

如果有更好的解决方案,请评论我的答案或回答问题。谢谢