用开玩笑模仿mongoose验证器

时间:2018-01-09 21:18:29

标签: node.js mongodb unit-testing mongoose jest

我正在测试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存储验证器引用的方式。

感谢您的帮助。

0 个答案:

没有答案