Javascript 如何在Jasmine中测试方法是否只调用了一次而不是第二次?

Javascript 如何在Jasmine中测试方法是否只调用了一次而不是第二次?,javascript,jquery,testing,knockout.js,jasmine,Javascript,Jquery,Testing,Knockout.js,Jasmine,我正在测试一种机制,该机制应该只调用一次方法,并防止任何后续的jasmine调用,通过附加断点,我可以看出该方法不会被第二次调用,但jasmine测试失败。我认为这与spy没有被设计为用于多次检查有关。 对于给定的情况,什么是合适的解决方案? 我不知道如何正确地进行jasmine测试JSFIDLE(我使用的jasmine版本是1.3.1,而测试模板是1.2.0) 测试如下所示: it("Invoking OnPreQuery will add event listener for OnTheM

我正在测试一种机制,该机制应该只调用一次方法,并防止任何后续的jasmine调用,通过附加断点,我可以看出该方法不会被第二次调用,但jasmine测试失败。我认为这与
spy
没有被设计为用于多次检查有关。
对于给定的情况,什么是合适的解决方案?

我不知道如何正确地进行jasmine测试JSFIDLE(我使用的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


我自己发现了,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);
    });
根据评论

在Jasmine 2.0中

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

被催促的时间(1)

现在这就容易多了

 expect(yourSpy).toHaveBeenCalledTimes(1);

在jasmine 2.0中,这一点略有改变。现在检查调用。count()。。。例如:expect(object.func.calls.count()).toBe(1);谢谢我还可以找出每个调用使用的参数吗?当然可以。请尝试
。与(“您的论点”)联系起来。
对不起,我弄糊涂了。如果spy被调用两次,第一次调用的参数为1,第二次调用的参数为2,我如何检查(a)spy被调用两次(b)第一次调用的参数为1(c)第二次调用的参数为2?根据函数的复杂性,您可能需要分别检查它们。这样,如果失败了,你就知道原因了。大概是这样的:1。使用
.toHaveBeenCalledTimes(2)
2检查函数是否被调用了两次。使用
toHaveBeenCalledWith(“参数1”)
3检查是否使用参数1调用了函数。检查您的函数是否是用参数2调用的,使用
来调用(“参数2”)
如果您想检查顺序,这可能有点麻烦。您可以深入间谍对象并检查每次调用的阵列位置。
expect(object.func.calls.count()).toBe(1);
 expect(yourSpy).toHaveBeenCalledTimes(1);