如果我的应用程序中具有以下模型:
// employee.js
const mongoose = require('mongoose');
const validators = require('./validators');
const EmployeeSchema = new mongoose.Schema({
firstName: { type: String, required: true },
lastName: { type: String, required: true },
referredBy: {
type: Schema.Types.ObjectId,
ref: 'Employee',
validate: {
isAsync: true,
validator: validators.referralValidator
}
}
});
module.exports = mongoose.model('Employee', EmployeeSchema);
基本上,这是公司员工的模型。该雇员本可以由其他现有雇员转介到公司工作,因此“雇员”集合中存在自引用。
验证将确保用户不会输入数据库中不存在的员工的ID。看起来像这样:
// validators.js
const mongoose = require('mongoose');
function referralValidator(val, callback) {
if (val) {
const Employee = mongoose.model('Employee');
Employee.findById(val.toString(), (err, found) => {
callback(found !== null);
});
} else {
callback(true);
}
}
module.exports = {
referralValidator
};
现在,我想测试该验证工作(可能是我以后将为要添加到模型中的其他字段编写的许多其他验证之一)。但是,我不想在测试中访问数据库,所以我想刺穿findById以手动控制测试的“找到”的值。我不知道如何处理猫鼬在后台使用的mongo驱动程序。
我该如何刺破此功能?或者,是否有更好的方法来实现验证器以使其更具可测试性?