如何在运行时删除中间件钩子?

时间:2017-10-04 07:09:46

标签: node.js mongodb mongoose mocha

我正在尝试为post hooks编写测试。保存user后,我们会在单独的集合中保存一些其他信息。我想验证细节是否保存在第二个集合中。由于钩子异步执行,我无法验证它。

userSchema.post('save', function(user, next){
  var filter = new filterModel({name: user.name});
  filter.save().then(()=>next());
});

在我的测试中,我想添加一个在第一个钩子之后执行的新钩子。在这里,我可以验证第一个钩子是否保存了filter对象。

describe('', ()=>{
   it('', (done)=>{
      userSchema.post('save', function(u){
         filterModel.findOne({...}).exec().then(()=>{
           assert(....);
           done();
         });
      })

      new userModel({name:'sid'}).save();
   })
});

问题是我在测试中添加了post钩子,这将适用于所有后续测试。是否可以在after块中删除此挂钩?

1 个答案:

答案 0 :(得分:0)

Mongoose document#save返回一个promise,你需要创建一个promise链并在then回调中执行必需的断言:

it('should ...', () => {
  let user = new User();

  return user
    .save()
    .then(() => // TODO: do your assertion here);
});

一个注意事项:在mocha中,对于异步测试,告诉mocha测试已完成,您可以使用done回调或返回一个承诺。