如何正确Mock Window函数以完成视口功能的单元测试?
你的视口Mock实现存在逻辑偏差,无法满足测试需求
兄弟,你的这个Mock方案没法准确模拟原代码的视口计算逻辑,问题出在几个关键的对应关系上:
- 原代码里的
windowTop是从$(window).pageYOffset或$(document).scrollTop获取的,但你用screenY()来模拟这个值——这俩根本不是一回事!screenY是浏览器窗口相对于屏幕顶部的位置,而pageYOffset/scrollTop是文档滚动的距离,属性含义完全不同,这样模拟会导致取值逻辑不匹配。 - 原代码里的
windowBottom是通过$(window).height() + windowTop计算出来的,但你直接把windowBottom作为height()的返回值了,这完全颠倒了逻辑。原逻辑是先拿窗口高度,再加滚动距离得到视口底部,而你的Mock相当于直接硬编码了视口底部,却没有正确模拟窗口高度这个核心参数。
修正后的Mock方案
要匹配原代码的逻辑,你应该这样调整Mock,让每个属性都对应原代码的取值来源:
var mockScrollTop = 0; // 对应原代码的windowTop var mockWindowHeight = 500; // 窗口本身的高度 // Mock window对象的对应属性 mockedWindow = { pageYOffset: mockScrollTop, // 对应$(window).pageYOffset height: () => { return mockWindowHeight; } // 对应$(window).height() }; // 如果原代码里会用到$(document).scrollTop,还要额外Mock document mockedDocument = { scrollTop: mockScrollTop };
这样原代码计算出来的windowBottom就是500 + 0 = 500,和你预期的结果一致,但逻辑上完全对齐了原代码的计算方式,测试结果才会准确可靠。
内容的提问来源于stack exchange,提问作者Niru
相关产品推荐
相关产品推荐

