我想在特定模型中为Mongoose save
方法创建一个存根,以便我创建的模型的任何实例都将调用存根而不是普通的Mongoose save
方法。我的理解是,这样做的唯一方法是将整个模型存根如下:
var stub = sinon.stub(myModel.prototype);
不幸的是,这行代码导致我的测试抛出以下错误:
TypeError: Cannot read property 'states' of undefined
有谁知道这里出了什么问题?
答案 0 :(得分:25)
有两种方法可以实现这一目标。第一个是
var mongoose = require('mongoose');
var myStub = sinon.stub(mongoose.Model, METHODNAME);
如果您控制log mongoose.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);
答案 1 :(得分:5)
看看sinon-mongoose。您可以只用几行来预测链式方法:
sinon.mock(YourModel).expects('find')
.chain('limit').withArgs(10)
.chain('exec');
您可以在回购中找到工作示例。
另外,建议:使用mock
方法代替stub
,这将检查方法是否真的存在。
答案 2 :(得分:4)
save
不是模型上的方法,它是文档上的方法(模型的实例)。陈述here in mongoose docs。
构建文件
文档是我们模型的实例。创建它们并保存到数据库很容易
因此,如果您使用模型模拟save()
使用sinon-mongoose&和@ Gon的回答。 factory-girl Account
是我的模特:
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...
})
答案 3 :(得分:1)
而不是整个对象,请尝试:
sinon.stub(YOURMODEL.prototype, 'save')
确保YOURMODEL不是实例的类。
答案 4 :(得分:0)
与切线相关,但相关...
我需要模拟一个自定义模型方法,例如:
myModelSchema.methods.myCustomMethod = function() {....}
我创建了一个存根:
myCustomMethodStub = sinon.stub(MyModel.schema.methods, 'myCustomMethod').callThrough();
答案 5 :(得分:0)
如djv所述,save
方法在文档上。因此,您可以通过以下方式存根:
const user = new User({
email: 'email@email.com',
firstName: 'firstName',
lastName: 'lastName',
userName: 'userName',
password: 'password',
});
stub(user, 'save').resolves({ foo: 'bar' });
奖金,您可以通过Chai和Chai as promised这样声明:
const promise = user.save();
await chai.assert.doesNotBecome(promise, { foo: 'bar' });