我正在测试mongoose模型的验证,在尝试模拟验证器时,模型仍然具有对原始函数的引用,因此验证会一直调用原始函数。
我想测试验证函数被调用,但是由于验证器进入db我需要模拟它。
这是我的模特:
const { hasRequiredCustoms } = require('../utils/validators')
const ProductSchema = new Schema({
customs: {
type: [String],
validate: hasRequiredCustoms // <- This is the validator
}
})
const Product = mongoose.model('Product', ProductSchema)
module.exports = Product
原始验证人:
module.exports = {
hasRequiredCustoms(val) {
console.log('Original')
// validation logic
return result
},
//etc...
}
这是验证者的模拟:
const validators = jest.genMockFromModule('../validators')
function hasRequiredCustoms (val) {
console.log('Mock')
return true
}
validators.hasRequiredCustoms = hasRequiredCustoms
module.exports = validators
测试:
test('Should be invalid if required customs missing: price', done => {
jest.mock('../../utils/validators')
function callback(err) {
if (!err) done()
}
const m = new Product( validProduct )
m.validate(callback)
})
每次运行测试时,控制台都会记录原始版本。为什么引用仍然会回到原始模块?好像我缺少一些关于如何工作的超级基本概念或者mongoose存储验证器引用的方式。
感谢您的帮助。