Mongoose 文档:手动执行钩子进行测试

Posted

技术标签:

【中文标题】Mongoose 文档:手动执行钩子进行测试【英文标题】:Mongoose document: Execute hook manually for testing 【发布时间】:2018-04-16 16:15:13 【问题描述】:

我想测试一些在 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');

如何手动执行这个钩子?

【问题讨论】:

【参考方案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();
);

任务完成。

【讨论】:

不幸的是,这似乎不适用于 2020 年的 Mongoose v5.9。【参考方案2】:

从 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(testDoc.property).to.eql('foo_modified');

【讨论】:

以上是关于Mongoose 文档:手动执行钩子进行测试的主要内容,如果未能解决你的问题,请参考以下文章

测试猫鼬预保存钩子

Mongoose - 不能在 post findOneAndUpdate 钩子中调用 model.find()

Mongoose - 不能在 post findOneAndUpdate 钩子中调用 model.find()

为啥Node Js mongoose文档删除不等待不执行?

为啥使用 Mongoose JS 删除嵌入式子文档数组的元素不起作用?

svn配置钩子更新网站目录 每次提交 程序会卡在正在发送文件 有人说是 脚本有问题 手动执行脚本没有问题