gpt4 book ai didi

node.js - 使用 express-validator 进行单元测试验证

转载 作者:搜寻专家 更新时间:2023-10-31 22:45:31 24 4
gpt4 key购买 nike

如何对使用 express-validator 完成的验证进行单元测试?

我曾尝试创建一个虚拟请求对象,但出现错误:TypeError: Object #<Object> has no method 'checkBody' .我能够手动测试验证是否在应用程序中有效。

这是我尝试过的:

describe('couponModel', function () {
it('returns errors when necessary fields are empty', function(done){
var testBody = {
merchant : '',
startDate : '',
endDate : ''
};
var request = {
body : testBody
};
var errors = Model.validateCouponForm(request);
errors.should.not.be.empty;
done();
});
});

我的理解是 checkBody当我有 app.use(expressValidator()) 时,方法被添加到请求对象中在我的快速应用程序中,但由于我只是测试验证是否在此单元测试中起作用,所以我没有可用的快速应用程序实例,并且我正在测试的验证方法无论如何都不会直接从它调用,因为它是仅通过 post 路由调用,我不想调用它进行单元测试,因为它涉及数据库操作。

最佳答案

这是新的 express-validator api (v4) 的解决方案:

tl;dr:您可以使用这个函数:

exports.testExpressValidatorMiddleware = async (req, res, middlewares) => {
await Promise.all(middlewares.map(async (middleware) => {
await middleware(req, res, () => undefined);
}));
};

它可以像这样这样调用:

const { validationResult } = require('express-validator/check');

await testExpressValidatorMiddleware(req, res, expressValidatorMiddlewareArray);
const result = validationResult(req);
expect(result....

这些解决方案假设您有可用的 async/await 语法。您可以使用 node-mocks-http创建 reqres 对象的库。

解释:

express-validator 数组中的每个元素都作为中间件应用于路由。说这是你的数组:

[
check('addresses.*.street').exists(),
check('addresses.*.postalCode').isPostalCode(),
]

每个检查都将作为中间件加载。

为了测试中间件,我们需要实现一个类似于 express 实现中间件的功能。

Express 中间件总是接受三个参数,请求和响应对象,以及它应该调用的下一个函数(按照惯例next)。为什么我们需要 next?对于我们希望我们的中间件在 之后执行某些操作的场景,例如

const loggerMiddleware = (req, res, next) => {
console.log('req body is ' + req.body);
next();
console.log('res status is ' + res.status);
};

但是 express-validator 不这样做,它只是在每个验证器完成后调用 next()。出于这个原因,我们的实现实际上不需要为 next() 操心。

相反,我们可以依次运行每个中间件并传递一个空函数作为 next 以避免 TypeError:

middlewares.map((middleware) => {
middleware(req, res, () => undefined);
});

但这行不通,因为 express-validator 中间件会返回 promises,我们需要等待它们解析...

middlewares.map(async (middleware) => {
await middleware(req, res, () => undefined);
});

在迭代中的所有 promise 都得到解决之前,我们不想继续前进(Promise.all 上的 Mozilla 文档是 here ):

await Promise.all(middlewares.map(async (middleware) => {
await middleware(req, res, () => undefined);
}));

我们应该将其提取为可重用函数:

exports.testExpressValidatorMiddleware = async (req, res, middlewares) => {
await Promise.all(middlewares.map(async (middleware) => {
await middleware(req, res, () => undefined);
}));
};

现在我们已经找到了我的解决方案。如果有人可以改进此实现,我很乐意进行修改。

关于node.js - 使用 express-validator 进行单元测试验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28769200/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com