Подтвердить что ты не робот

Ожидаемый шпион, но получил функцию

Я пытаюсь реализовать тест (1) для этого модуля (2).
Моя цель - проверить, извлекается ли коллекция при возникновении определенного события.
Как вы можете видеть из моего комментария в (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
});
4b9b3361

Ответ 1

Вам нужно войти в фактический метод, который в этом случае находится на прототипе.

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

Шпионаж на прототипе - хороший трюк, который вы можете использовать, когда не можете добраться до фактического экземпляра, на который хотите следить.

Ответ 2

Я тоже получал ту же проблему, но я решил ее, передав аргумент в вызове функции. Затем вы должны написать свой тестовый пример, как в it

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

Ответ 3

У меня была эта ошибка, потому что у меня было две версии синона, или, возможно, я не инициализировал синон-жасмин правильно. Когда я явно загрузил синус, а затем синус жасмин в моей спецификации, он начал работать правильно.