我有以下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),这是第三个元素。
答案 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作为测试框架。
如果有更好的解决方案,请评论我的答案或回答问题。谢谢