用Sinon对Mongoose模型进行挖掘

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)


Gon*_*Gon 8

看看sinon-mongoose.您可以只用几行来预测链式方法:

sinon.mock(YourModel).expects('find')
  .chain('limit').withArgs(10)
  .chain('exec');
Run Code Online (Sandbox Code Playgroud)

您可以在回购中找到工作示例.

另外,建议:使用mock方法代替stub,即检查方法确实存在.

  • 这是否取决于代码的编写方式,而不是代码在做什么?无论调用在被测代码中是否链接,测试都应该是有效的。 (2认同)

djv*_*djv 6

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)

  • 在网上寻找一个正弦/猫鼬兼容的答案,谢谢。 (2认同)