单元测试 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 作为测试框架。
如果有更好的解决办法,欢迎评论我的回答或者回答问题。谢谢
我有以下 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 作为测试框架。
如果有更好的解决办法,欢迎评论我的回答或者回答问题。谢谢