express-validator 只知道请求对象本身,这使得最终用户的复杂性非常低。更重要的是,
它只真正知道请求的输入位置—— body
、cookies
、headers
和。query
params
您的自定义验证器是完全正确的。话虽如此,它可能是不可测试的,因为您似乎依赖于全球背景。
为了使其可测试,我看到的 2 个选项是:
1.注入req.Users
:
这将涉及使用一些将您的商店对象设置为的中间件req
:
// Validator definition
const emailValidator = (value, { req }) => {
return req.Users.findOne({ email: value }).then(...);
}
// In production code
// Sets req.Users, req.ToDo, req.YourOtherBusinessNeed
app.use(myObjectsStore.middleware);
app.post('/users', check('email').custom(emailValidator));
// In tests
req = { Users: MockedUsersObject };
expect(emailValidator('foo@bar.com', { req })).rejects.toThrow('email exists');
2. 编写一个返回验证器实例的工厂函数:
这是我的首选解决方案,因为它不再涉及使用请求对象。
// Validator definition
const createEmailValidator = Users => value => {
return Users.findOne({ email: value }).then(...);
};
// In production code
app.post('/users', [
check('email').custom(createEmailValidator(myObjectsStore.Users)),
]);
// Or in tests
expect(createEmailValidator(MockedUsersObject)('foo@bar.com')).rejects.toThrow('email exists');
希望这可以帮助!