用Sinon扼杀一个mongoose模型

我想在特定的模型中为Mongoose保存方法创build一个存根,所以我创build的模型的任何实例都将调用存根,而不是正常的Mongoose保存方法。 我的理解是要做到这一点的唯一方法就是像这样对整个模型进行存根:

var stub = sinon.stub(myModel.prototype); 

不幸的是,这行代码会抛出以下错误:

 TypeError: Cannot read property 'states' of undefined 

有没有人知道这里出了什么问题?

有两种方法可以做到这一点。 首先是

 var mongoose = require('mongoose'); var myStub = sinon.stub(mongoose.Model, METHODNAME); 

如果你控制台loginmongoose.Model,你会看到模型可用的方法(特别是这不包括lte选项)。

另一种(具体型号)的方式是

 var myStub = sinon.stub(YOURMODEL.prototype.base.Model, 'METHODNAME'); 

再一次,相同的方法可用于存根。

编辑:一些方法如保存被如下所示:

 var myStub = sinon.stub(mongoose.Model.prototype, METHODNAME); var myStub = sinon.stub(YOURMODEL.prototype, METHODNAME); 

看一下sinon-mongoose 。 你可以期待只用几行链接的方法:

 sinon.mock(YourModel).expects('find') .chain('limit').withArgs(10) .chain('exec'); 

你可以找回工作的例子。

此外,build议:使用mock方法而不是stub ,这将检查方法确实存在。

save不是模型上的方法,它是文档(模型的实例)上的方法。 这里在mongoose文档中 。

构build文档

文件是我们模型的实例。 创build它们并保存到数据库很容易

因此,如果你使用你的模型来模拟一个save() ,它将永远是不确定的。

与@Gon的答案一起,使用Sinon-mongoose和工厂女孩与Account是我的模型:

不pipe用

 var AccountMock = sinon.mock(Account) AccountMock .expects('save') // TypeError: Attempted to wrap undefined property save as function .resolves(account) 

工作

 var account = { email: 'sasha@gmail.com', password: 'abc123' } Factory.define(account, Account) Factory.build('account', account).then(accountDocument => { account = accountDocument var accountMock = sinon.mock(account) accountMock .expects('save') .resolves(account) // do your testing... }) 

而不是整个对象,请尝试:

 sinon.stub(YOURMODEL.prototype, 'save') 

确保YOURMODEL不是实例。