如何使用Jasmine测试我的Javascript回调?

时间:2014-02-23 22:32:14

标签: javascript unit-testing jasmine

我需要测试当用户将窗口滚动到某个点时是否调用特定方法。在我的源代码中,我附加了Windows监听器,类似于:

$(window).on("scroll.singleJob",function(e)
{       
    // code here, check if the window is scrolled past certain point etc. and then I need to call this method
            LozengesPanel.makeFixed();              
}

现在,在我的Jasmine测试中,我正在尝试确认当窗口滚动到某个点时正在调用该方法。所以我设置了测试:

describe("SingleJob page", function() {

    beforeEach(function() {

        loadFixtures('my_fixture.html');
    });


    it("panel sticks to top when page scrolled down", function() {

        spyOn(mycompany.singleJobTestable.LozengesPanel, "makeFixed");

        window.scroll(0,1000);

           expect(mycompany.singleJobTestable.LozengesPanel.makeFixed).toHaveBeenCalled();
    });
});

但测试失败了,我得到的只是Expected spy makeFixed to have been called. 如何触发窗口滚动以便我可以测试此回调中的方法?

编辑:

最后这一切都有道理..似乎滚动事件被放入任务队列中,只在当前线程完成后执行。添加$(window).trigger(“scroll”);做了伎俩。我发布了关于它的简短博文,解释了问题http://spirytoos.blogspot.com.au/2014/02/testing-windowscroll-with-qunitjasmine.html

2 个答案:

答案 0 :(得分:0)

编辑:这个答案不符合这个问题。请参阅评论。

实际上,您似乎正在从Jasmine规范中触发滚动事件。我尝试了非常相似的代码,我在下面提到。但是,我的expect仍然失败,就像你的(我仍然熟悉Jasmine,所以我无法肯定地解释为什么会这样)。

var fun = {
    scrollEventCallback: function() {
        console.log('scroll event triggered');
    }
};
$(window).on('scroll', fun.scrollEventCallback);

describe("A test suite", function() {

    it("should trigger f", function() {
        spyOn(fun, "scrollEventCallback");
        $(window).trigger('scroll'); // my callback function is executed because it logs to the console
       expect(fun.scrollEventCallback).toHaveBeenCalled(); // this fails anyway
    });
});

答案 1 :(得分:0)

也许您的window.scroll(0, 1000)实际上没有将视口推得足够低以触发Lozenges.makeFixed()来电。如果页面(我认为你的夹具)不长并且实际上没有任何地方可以滚动,那就是这种情况。

此外,我得到的代码类似于您提供的代码。 expect(...)成功。它贴在下面。

var LozengesPanel = {
    makeFixed: function() {
        console.log('makeFixed was called with its original function definition');
    }
};

$(window).on("scroll.singleJob",function(e) {
    LozengesPanel.makeFixed();
});

describe("A test suite", function() {
    it("should trigger callback", function() {
        spyOn(LozengesPanel, "makeFixed");
        $(window).trigger('scroll'); // nothing is logged to the console
        expect(LozengesPanel.makeFixed).toHaveBeenCalled(); // succeeds
    });
});