如果我的应用程序中有以下模型:
// 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 来手动控制测试的“found”值。我不知道如何绕过 mongoose 在幕后雇用的 mongo 驱动程序。
我怎么能刺伤这个功能?或者,是否有更好的方法来实现验证器以使其更具可测试性?