web-dev-qa-db-ja.com

スパイを期待していたが、機能を得た

このモジュール(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
});
25

実際のメソッドに入る必要があります。この場合は、プロトタイプ上にあります。

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();
    });
});

プロトタイプをスパイすることは、スパイしたい実際のインスタンスに到達できないときに使用できる素敵なトリックです。

41
antonjs

私も同じ問題を抱えていましたが、関数呼び出しで引数を渡すことで解決しました。次に、itにこのようなテストケースを記述する必要があります

var data = {name:"test"}
spyOn(UsersBoardCollection.prototype, "restartPolling").and.callThrough();
UsersBoardCollection.prototype.restartPolling(data);
expect(UsersBoardCollection.prototype.restartPolling).toHaveBeenCalled();
3
Tabish

Sinonの2つのバージョンがロードされているか、またはsinon-jasmineを正しく初期化していないため、このバグが発生しました。仕様のセットアップで明示的にsinonをロードしてからsinon jasmineをロードすると、正しく実行し始めました。

0
bnolan