使用jasmine.spyOn获取mongoose模式方法

mat*_*n23 7 mongoose node.js jasmine

我无法让茉莉花间谍为我的mongoose文件工作.我在我的用户架构中设置了一个方法,如下所示:

User.methods.doSomething = function() {
   // implementation
}
Run Code Online (Sandbox Code Playgroud)

用户是我正在测试的模型的依赖项,我想确保正确调用doSomething.在我的测试中我有类似的东西:

spyOn(User.schema.methods, 'doSomething')
Run Code Online (Sandbox Code Playgroud)

如果我注销User.schema.methods.doSomething我得到了我期望的函数但是当我运行调用该方法的代码时,调用原始实现而不是间谍.我也做不到:

spyOn(userInstance, 'doSomething')
Run Code Online (Sandbox Code Playgroud)

在我的测试中,因为userInstance没有暴露,我真的想避免暴露它.基本上我想在User文档(实例?)原型上设置一个间谍.那可能吗?

小智 4

Mongoose 将模式中定义的方法复制到模型原型中,并且仅使用这些方法。所以尽管

User.schema.methods.doSomething === User.prototype.doSomething
Run Code Online (Sandbox Code Playgroud)

如果你设置:

spyOn(User.schema.methods, 'doSomething')
Run Code Online (Sandbox Code Playgroud)

它不会被调用 -User.prototype.doSomething会的。你的猜测是对的,你应该使用:

spyOn(User.prototype, 'doSometing');
Run Code Online (Sandbox Code Playgroud)

and.callThrough如果您想在设置间谍后调用原始方法,请不要忘记使用(我对此很感兴趣)。