特定のモデルでMongoosesave
メソッドのスタブを作成したいので、作成したモデルのインスタンスは通常のMongoose save
メソッドの代わりにスタブを呼び出します。私の理解では、これを行う唯一の方法は、次のようにモデル全体をスタブ化することです。
var stub = sinon.stub(myModel.prototype);
残念ながら、このコード行により、テストで次のエラーがスローされます。
TypeError: Cannot read property 'states' of undefined
ここで何が悪いのか誰か知っていますか?
これを実現するには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);
sinon-mongoose をご覧ください。ほんの数行で連鎖メソッドを期待できます。
sinon.mock(YourModel).expects('find')
.chain('limit').withArgs(10)
.chain('exec');
リポジトリで実際の例を見つけることができます。
また、推奨事項:mock
の代わりにstub
メソッドを使用すると、メソッドが実際に存在するかどうかがチェックされます。
save
はモデルのメソッドではなく、ドキュメント(モデルのインスタンス)のメソッドです。述べられている ここマングースのドキュメントで 。
ドキュメントの作成
ドキュメントはモデルのインスタンスです。それらを作成してデータベースに保存するのは簡単です
したがって、モデルを使用してsave()
をモックしている場合は、常に未定義になります。
@Gonの答えに沿って、 sinon-mongoose & 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: '[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...
})
オブジェクト全体の代わりに、次のことを試してください。
sinon.stub(YOURMODEL.prototype, 'save')
YOURMODELがインスタンスではなくクラスであることを確認してください。
接線方向に関連しているが、関連している...
次のようなカスタムモデルメソッドをモックする必要がありました。
myModelSchema.methods.myCustomMethod = function() {....}
私が行ったスタブを作成するには:
myCustomMethodStub = sinon.stub(MyModel.schema.methods, 'myCustomMethod').callThrough();