27

我想为save特定模型中的 Mongoose 方法创建一个存根,以便我创建的模型的任何实例都将调用存根而不是普通的 Mongoosesave方法。我的理解是,这样做的唯一方法是像这样对整个模型进行存根:

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

不幸的是,这行代码导致我的测试抛出以下错误:

TypeError: Cannot read property 'states' of undefined

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

4

6 回答 6

31

有两种方法可以做到这一点。第一个是

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

如果您控制台日志 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);
于 2012-07-19T19:22:44.390 回答
8

看看sinon-mongoose。您可以期望只有几行的链式方法:

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

您可以在 repo 上找到工作示例。

另外,建议:使用mockmethod 而不是stub,这将检查该方法是否确实存在。

于 2015-11-13T15:48:03.957 回答
7

save不是模型上的方法,而是文档(模型的实例)上的方法。在mongoose文档中说明。

构建文档

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

因此,如果您使用模型来模拟一个save()

配合@Gon的回答,使用sinon-mongoosefactory-girlAccount作为我的模特:

不管用

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...
})
于 2016-01-07T22:37:06.197 回答
2

Instead of the whole object, try:

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

Make sure YOURMODEL is the class not the instance.

于 2012-07-17T08:47:55.807 回答
2

切线相关,但相关...

我需要模拟一个自定义模型方法,例如:

myModelSchema.methods.myCustomMethod = function() {....}

要创建一个存根,我做了:

myCustomMethodStub = sinon.stub(MyModel.schema.methods, 'myCustomMethod').callThrough();
于 2018-07-19T20:31:53.703 回答
1

正如djv所说,该save方法在文档上。所以你可以这样存根:

const user = new User({
      email: 'email@email.com',
      firstName: 'firstName',
      lastName: 'lastName',
      userName: 'userName',
      password: 'password',
    });

stub(user, 'save').resolves({ foo: 'bar' });

奖励,您可以按照以下方式使用ChaiChai声明它:

const promise = user.save();
await chai.assert.doesNotBecome(promise, { foo: 'bar' });
于 2020-11-18T13:17:00.220 回答