web-dev-qa-db-ja.com

マングースモデルをシノンでスタブする

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

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

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

TypeError: Cannot read property 'states' of undefined

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

22
amandawulf

これを実現するには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);
29
Jacob

sinon-mongoose をご覧ください。ほんの数行で連鎖メソッドを期待できます。

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

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

また、推奨事項:mockの代わりにstubメソッドを使用すると、メソッドが実際に存在するかどうかがチェックされます。

8
Gon

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: '[email protected]', 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...
})
6
djv

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

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

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

1
Tanzeeb Khalili

接線方向に関連しているが、関連している...

次のようなカスタムモデルメソッドをモックする必要がありました。

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

私が行ったスタブを作成するには:

myCustomMethodStub = sinon.stub(MyModel.schema.methods, 'myCustomMethod').callThrough();
1
theUtherSide