单元测试 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)。但是测试没有用。尽管我发送了空正文(它应该返回 res.status(422)),但测试总是返回“next()”。

对上面的 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)的所有对象。之后,我们运行验证器的最后一个对象,即 function(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 作为测试框架。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何解决Express Validator中间件错误?

来自分类Dev

Express Validator 使用 5.3.0 中间件功能

来自分类Dev

Express中间件测试Mocha Chai

来自分类Dev

对Express中的中间件测试进行存根请求\响应

来自分类Dev

Jest Express使用参数测试中间件

来自分类Dev

Mocha 测试 express 异步中间件不起作用

来自分类Dev

Django 单元测试中间件错误

来自分类Dev

如何使用express-validator中的checkSchema中间件验证嵌套的POST主体有效负载?

来自分类Dev

运行测试时如何优雅地跳过express-jwt中间件?

来自分类Dev

如何使用事件发射器测试 express 中间件

来自分类Dev

在Koa中使用Express中间件

来自分类Dev

Express 4中的中间件顺序

来自分类Dev

Express中间件,next和Promises

来自分类Dev

为什么Express不是中间件?

来自分类Dev

Express 4:中间件分支

来自分类Dev

在 express 中跳过中间件

来自分类Dev

post方法后的Express中间件

来自分类Dev

在Express中测试中间件而不创建重新创建服务器的简单方法?

来自分类Dev

Express:从另一个中间件调用中间件

来自分类Dev

如何测试路由的中间件?

来自分类Dev

Laravel 测试认证中间件

来自分类Dev

如何测试简单的中间件

来自分类Dev

我应该如何使用大猩猩上下文对中间件软件包进行单元测试

来自分类Dev

在单元测试期间,如何在Django RequestFactory中设置消息传递和会话中间件

来自分类Dev

express.js中间件中的空params对象

来自分类Dev

express.js压缩中间件不起作用

来自分类Dev

从Express堆栈中删除中间件的正确方法?

来自分类Dev

Express / Connect:是否可以多次使用静态中间件?

来自分类Dev

路由后的Node Express 4中间件

Related 相关文章

热门标签

归档