Как проверить, был ли метод вызван только один раз, а не второй раз в Жасмине?

Я тестирую механизм, который должен вызывать метод один раз и предотвращать любые последующие вызовы с жасмином. Я вижу, присоединяя точки останова, что этот метод НЕ вызывается второй раз, но тест жасмина терпит неудачу. Я предполагаю, что это связано с тем, что spy не предназначен для использования для нескольких проверок.
Что было бы правильным решением данной ситуации?

JSfiddle of Code, который тестируется Я не мог понять, как правильно выполнить jasmine test jsfiddle (версия Jasmine, которую я использую, - 1.3. 1, а тестовый шаблон - на 1.2.0).

Тест выглядит следующим образом:

 it("Invoking OnPreQuery will add event listener for OnTheMoveViewPreLoad event. Triggering OnTheMoveViewPreLoad twice will call getChildrenForMasterRecordList only first time", function () {
            AddTreeSettingsObjectToBC({ bc: bc, Tree: { IncludeChildren: true} });
            ComposeMockPageObjWithObservableFieldsWithChildren();
            var preQuerySpy = spyOnEvent(onTheMove.PageDataRoles, 'OnPreQuery');
            $(onTheMove.PageDataRoles).trigger('OnPreQuery', { knockoutContextName: 'bc' });
            expect('OnPreQuery').toHaveBeenTriggeredOn(onTheMove.PageDataRoles);
            expect(preQuerySpy).toHaveBeenTriggered();
            var getChildrenForMasterRecordListSpy = spyOn(window, 'getChildrenForMasterRecordList');
            $(onTheMove.PageDataRoles).trigger('OnTheMoveViewPreLoad', { knockoutContextName: 'bc' });
            expect(getChildrenForMasterRecordListSpy).toHaveBeenCalled();
            $(onTheMove.PageDataRoles).trigger('OnTheMoveViewPreLoad', { knockoutContextName: 'bc' });
            expect(getChildrenForMasterRecordListSpy).not.toHaveBeenCalled();
        });

Проверяемый код: HTML

<div data-role="page"></div>

Javascript

var onTheMove = function(){};
$.extend(onTheMove,{
    NullValue : "null",
    PageDataRoles : 'div[data-role="page"], div[data-role="dialog"]',
    OnTheMovePrefix : 'OnTheMove_'
    });

$(document).on('OnPreQuery', onTheMove.PageDataRoles, function (e, options) {
    var isChildAttachmentQueued = true;
    var knockoutContextName = options.knockoutContextName;
    if (TreeEnabled(knockoutContextName)) {
        var isModelReadyToAttachChildren = function () {
            var isReady = false;
            if (PageObj[knockoutContextName] != undefined) {
                isReady = (PageObj[knockoutContextName]().length > 0) && isChildAttachmentQueued;
            }

            return isReady;
        };
        var treeSettings = eval(knockoutContextName).Tree;
        treeSettings.knockoutContextName = knockoutContextName;
        $(onTheMove.PageDataRoles).on('OnTheMoveViewPreLoad', function (e, options) {
            if (isModelReadyToAttachChildren()) {
                getChildrenForMasterRecordList({
                    parentTable: eval(knockoutContextName).primaryTableName,
                    knockoutContextName: treeSettings.knockoutContextName,
                    parentIdColumn: treeSettings.ParentIdColumn,
                    masterIdColumn: treeSettings.MasterIdColumn
                });
                isChildAttachmentQueued = false;
            }
        });
    }
});
function getChildrenForMasterRecordList(options) {
    console.log('beep');
}

Ответы

Ответ 1

Выяснилось, что spy имеет свойство callCount, которое автоматически увеличивается на один на каждый вызов.

    it("Invoking OnPreQuery will add event listener for OnTheMoveViewPreLoad event. Triggering OnTheMoveViewPreLoad twice will call getChildrenForMasterRecordList only first time", function () {
        AddTreeSettingsObjectToBC({ bc: bc, Tree: { IncludeChildren: true} });
        ComposeMockPageObjWithObservableFieldsWithChildren();
        var preQuerySpy = spyOnEvent(onTheMove.PageDataRoles, 'OnPreQuery');
        $(onTheMove.PageDataRoles).trigger('OnPreQuery', { knockoutContextName: 'bc' });
        expect('OnPreQuery').toHaveBeenTriggeredOn(onTheMove.PageDataRoles);
        expect(preQuerySpy).toHaveBeenTriggered();
        var getChildrenForMasterRecordListSpy = spyOn(window, 'getChildrenForMasterRecordList');
        $(onTheMove.PageDataRoles).trigger('OnTheMoveViewPreLoad', { knockoutContextName: 'bc' });
        expect(getChildrenForMasterRecordListSpy).toHaveBeenCalled();
        $(onTheMove.PageDataRoles).trigger('OnTheMoveViewPreLoad', { knockoutContextName: 'bc' });
        expect(getChildrenForMasterRecordListSpy.callCount).toEqual(1);
    });

в соответствии с комментарием

в Жасмине 2.0 его

expect(object.func.calls.count()).toBe(1);