我有以下快速验证器中间件代码进行测试
//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] 删除。
我来说两句