Angular如何测试window滚动事件?测试时window.scrollY始终为0如何解决
问题原因
- 执行顺序错误:你先触发了
scroll事件,才调用window.scrollTo设置滚动位置,事件触发时scrollY还未被修改,读到的值自然是0。 - 测试环境限制:默认的Angular单元测试环境(通常为Karma+Jasmine)运行在无实际滚动高度的沙箱容器中,直接调用
window.scrollTo大概率不会真实修改window.scrollY的值,属于测试环境的模拟限制。
解决方法
优先选择第一种方案,更符合单元测试的隔离原则,不需要依赖浏览器全局行为:
方案1:直接模拟滚动事件传入组件
it("onScroll_Down_StickyIsTrue", () => { // 构造模拟滚动事件,手动指定currentTarget的scrollY值为50 const mockScrollEvent = new Event('scroll'); Object.defineProperty(mockScrollEvent, 'currentTarget', { value: { scrollY: 50 } }); // 直接调用组件的滚动监听方法传入模拟事件 component.onScroll(mockScrollEvent); expect(component.sticky).toBeTrue(); });
方案2:模拟window.scrollY属性再触发事件
如果需要走全局事件触发的完整流程,可以手动修改window的scrollY模拟值:
it("onScroll_Down_StickyIsTrue", () => { // 先修改window.scrollY的模拟值,configurable设为true方便测试后重置 Object.defineProperty(window, 'scrollY', { value: 50, configurable: true }); // 再触发全局滚动事件 window.dispatchEvent(new Event('scroll')); expect(component.sticky).toBeTrue(); // 测试结束后重置属性,避免污染其他测试用例 delete (window as any).scrollY; });
内容的提问来源于stack exchange,提问作者Doublon
相关产品推荐
相关产品推荐

