ama*_*ulf 20 mongoose node.js sinon
我想创建一个猫鼬存根save在特定模型的方法,让我创造我的模型的任何实例将调用存根而不是正常的猫鼬的save方法.我的理解是,这样做的唯一方法是将整个模型存根如下:
var stub = sinon.stub(myModel.prototype);
Run Code Online (Sandbox Code Playgroud)
不幸的是,这行代码导致我的测试抛出以下错误:
TypeError: Cannot read property 'states' of undefined
Run Code Online (Sandbox Code Playgroud)
有谁知道这里出了什么问题?
Jac*_*cob 28
有两种方法可以实现这一目标.首先是
var mongoose = require('mongoose');
var myStub = sinon.stub(mongoose.Model, METHODNAME);
Run Code Online (Sandbox Code Playgroud)
如果您控制log mongoose.Model,您将看到模型可用的方法(特别是这不包括lte选项).
另一种(模型特定的)方式是
var myStub = sinon.stub(YOURMODEL.prototype.base.Model, 'METHODNAME');
Run Code Online (Sandbox Code Playgroud)
同样,存根可以使用相同的方法.
编辑:某些方法,如保存,如下所示:
var myStub = sinon.stub(mongoose.Model.prototype, METHODNAME);
var myStub = sinon.stub(YOURMODEL.prototype, METHODNAME);
Run Code Online (Sandbox Code Playgroud)
看看sinon-mongoose.您可以只用几行来预测链式方法:
sinon.mock(YourModel).expects('find')
.chain('limit').withArgs(10)
.chain('exec');
Run Code Online (Sandbox Code Playgroud)
您可以在回购中找到工作示例.
另外,建议:使用mock方法代替stub,即检查方法确实存在.
save不是模型上的方法,而是文档上的方法(模型的实例)。说在这里猫鼬文档。
制作文件
文档是我们模型的实例。创建它们并将其保存到数据库很容易
因此,如果您使用模型来模拟 save()
与@坤的回答会一起使用兴农,猫鼬和工厂女孩用Account是我的模型:
var AccountMock = sinon.mock(Account)
AccountMock
.expects('save') // TypeError: Attempted to wrap undefined property save as function
.resolves(account)
Run Code Online (Sandbox Code Playgroud)
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...
})
Run Code Online (Sandbox Code Playgroud)