【发布时间】:2020-10-01 14:17:25
【问题描述】:
我已阅读有关此主题的所有相关问题,并且我意识到这可能会被标记为重复,但我终其一生都无法弄清楚如何让它发挥作用。
我有一个懒加载元素的简单函数:
export default function lazyLoad(targets, onIntersection) {
const observer = new IntersectionObserver((entries, self) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
onIntersection(entry.target);
self.unobserve(entry.target);
}
});
});
document.querySelectorAll(targets).forEach((target) => observer.observe(target));
return observer;
}
示例用法:
lazyLoad('.lazy-img', (img) => {
const pictureElement = img.parentElement;
const source = pictureElement.querySelector('.lazy-source');
source.srcset = source.getAttribute('data-srcset');
img.src = img.getAttribute('data-src');
});
现在,我正在尝试使用 jest 测试 lazyLoad 函数,但我显然需要模拟 IntersectionObserver,因为它是浏览器 API,而不是原生 JavaScript。
以下工作用于测试observe 方法:
let observe;
let unobserve;
beforeEach(() => {
observe = jest.fn();
unobserve = jest.fn();
window.IntersectionObserver = jest.fn(() => ({
observe,
unobserve,
}));
});
describe('lazyLoad utility', () => {
it('calls observe on each target', () => {
for (let i = 0; i < 3; i++) {
const target = document.createElement('img');
target.className = 'lazy-img';
document.body.appendChild(target);
}
lazyLoad(
'.lazy-img',
jest.fn(() => {})
);
expect(observe).toHaveBeenCalledTimes(3);
});
});
但我还想测试触发回调的.isIntersecting 逻辑......但我不知道该怎么做。如何用 jest 测试交叉点?
【问题讨论】:
-
将其作为参数传递。
-
@Adam 你能澄清一下你的意思吗?我应该通过什么作为论点?谢谢!
-
lazyLoad(targets,onIntersection,observer = IntersectionObserver) -
@Adam 谢谢!不幸的是,我已经阅读了那个 SO 帖子,但它对我没有帮助。我主要停留在如何模拟
.isIntersecting检查 IntersectionObserver。
标签: javascript unit-testing jestjs