我需要测试当用户将窗口滚动到某个点时是否调用特定方法。在我的源代码中,我附加了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
答案 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
});
});