このモジュール(2)のテスト(1)を実装しようとしています。
私の目的は、特定のイベントがトリガーされたときにコレクションが取得されるかどうかを確認することです。
(2)のコメントからわかるように、メッセージError: Expected a spy, but got Function.
モジュールは動作しますが、テストは失敗します。何か案は?
(1)
// jasmine test module
describe('When onGivePoints is fired', function () {
beforeEach(function () {
spyOn(this.view.collection, 'restartPolling').andCallThrough();
app.vent.trigger('onGivePoints');
});
it('the board collection should be fetched', function () {
expect(this.view.collection.restartPolling).toHaveBeenCalled();
// Error: Expected a spy, but got Function.
});
});
(2)
// model view module
return Marionette.CompositeView.extend({
initialize: function () {
this.collection = new UserBoardCollection();
this.collection.startPolling();
app.vent.on('onGivePoints', this.collection.restartPolling);
},
// other code
});
実際のメソッドに入る必要があります。この場合は、プロトタイプ上にあります。
describe('When onGivePoints is fired', function () {
beforeEach(function () {
spyOn(UsersBoardCollection.prototype, 'restartPolling').andCallThrough();
app.vent.trigger('onGivePoints');
});
it('the board collection should be fetched', function () {
expect(UsersBoardCollection.prototype.restartPolling).toHaveBeenCalled();
});
});
プロトタイプをスパイすることは、スパイしたい実際のインスタンスに到達できないときに使用できる素敵なトリックです。
私も同じ問題を抱えていましたが、関数呼び出しで引数を渡すことで解決しました。次に、it
にこのようなテストケースを記述する必要があります
var data = {name:"test"}
spyOn(UsersBoardCollection.prototype, "restartPolling").and.callThrough();
UsersBoardCollection.prototype.restartPolling(data);
expect(UsersBoardCollection.prototype.restartPolling).toHaveBeenCalled();
Sinonの2つのバージョンがロードされているか、またはsinon-jasmineを正しく初期化していないため、このバグが発生しました。仕様のセットアップで明示的にsinonをロードしてからsinon jasmineをロードすると、正しく実行し始めました。