27

特定のモデルでMongooseメソッドのスタブを作成したいので、作成したsaveモデルのインスタンスは通常のMongoosesaveメソッドの代わりにスタブを呼び出します。私の理解では、これを行う唯一の方法は、次のようにモデル全体をスタブ化することです。

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

残念ながら、このコード行により、テストで次のエラーがスローされます。

TypeError: Cannot read property 'states' of undefined

ここで何が悪いのか誰か知っていますか?

4

6 に答える 6

31

これを実現するには2つの方法があります。最初は

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

ログmongoose.Modelをコンソールすると、モデルで使用可能なメソッドが表示されます(特に、これにはlteオプションは含まれていません)。

他の(モデル固有の)方法は

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

この場合も、同じメソッドをスタブで使用できます。

編集:saveなどのいくつかのメソッドは次のようにスタブされます:

var myStub = sinon.stub(mongoose.Model.prototype, METHODNAME);
var myStub = sinon.stub(YOURMODEL.prototype, METHODNAME);
于 2012-07-19T19:22:44.390 に答える
8

シノンマングースを見てください。ほんの数行で連鎖メソッドを期待できます。

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

リポジトリで実際の例を見つけることができます。

また、推奨事項:mockメソッドの代わりにメソッドを使用stubして、メソッドが実際に存在することを確認します。

于 2015-11-13T15:48:03.957 に答える
7

saveモデルのメソッドではなく、ドキュメント(モデルのインスタンス)のメソッドです。ここでマングースのドキュメントに記載されています。

ドキュメントの作成

ドキュメントはモデルのインスタンスです。それらを作成してデータベースに保存するのは簡単です

したがって、モデルを使用してモックを作成している場合は、常に未定義になります。save()

@Gonの答えに沿って、私のモデルであるsinon-mongoosefactory-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...
})
于 2016-01-07T22:37:06.197 に答える
2

オブジェクト全体の代わりに、次のことを試してください。

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

YOURMODELがインスタンスではなくクラスであることを確認してください。

于 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' });

ボーナス、あなたはこのように約束されたようにチャイとチャイでそれを主張することができます:

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