Mongoose文件:手动执行挂钩进行测试

时间:2017-11-03 20:40:27

标签: node.js testing mongoose mongoose-schema

我想测试一些在Mongoose pre save钩子中执行的文档转换。简化示例:

mySchema.pre('save', function(callback) {
  this.property = this.property + '_modified';
  callback();
});

测试:

var testDoc = new MyDocument({ property: 'foo' });
// TODO -- how to execute the hook?
expect(testDoc.property).to.eql('foo_modified');

如何手动执行此挂钩?

2 个答案:

答案 0 :(得分:1)

好的,这就是我们最后所做的。我们用无操作实现替换了$__save函数:

// overwrite the $__save with a no op. function, 
// so that mongoose does not try to write to the database
testDoc.$__save = function(options, callback) {
  callback(null, this);
};

这可以防止命中数据库,但显然仍会调用pre挂钩。

testDoc.save(function(err, doc) {
  expect(doc.property).to.eql('foo_modified');
  done();
});

完成任务。

答案 1 :(得分:0)

从Mongoose 5.9开始,使用$__save替代似乎无效,因此这是一种替代方法,不需要您直接调用save()方法:

const runPreSaveHooks = async (doc) => {
  return new Promise((resolve, reject) => {
    doc.constructor._middleware.execPre("save", doc, [doc], (error) => {
      error ? reject(error) : resolve(doc);
    });
  });
};

await runPreSaveHooks(testDoc);
expect(doc.property).to.eql('foo_modified');