web-dev-qa-db-ja.com

ジャスミンでメソッドが1回だけ呼び出され、2回呼び出されていないかどうかをテストする方法は?

私はメソッドを1回呼び出し、その後のジャスミンによる呼び出しを防ぐメカニズムをテストしています。ブレークポイントをアタッチすることにより、2回目にメソッドが呼び出されていないことがわかりますが、ジャスミンテストは失敗します。複数のチェックに使用するように設計されていないspyに関係していると思います。
特定の状況に対する適切な解決策は何ですか?

テスト中のコードのJSfiddle ジャスミンテスト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');
}
20

私自身がそれを理解した、spyにはプロパティcallCountがあり、呼び出しごとに1ずつ自動インクリメントします。

    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);
28

toHaveBeenCalledTimes(1)

これではるかに簡単になります。

 expect(yourSpy).toHaveBeenCalledTimes(1);
13
Jeremy Swagger