我有以下方法:
componentDidLoad() {
this.image = this.element.shadowRoot.querySelector('.lazy-img');
this.observeImage();
}
observeImage = () => {
if ('IntersectionObserver' in window) {
const options = {
rootMargin: '0px',
threshold: 0.1
};
this.observer = new window.IntersectionObserver(
this.handleIntersection,
options
);
this.observer.observe(this.image);
} else {
this.image.src = this.src;
}
};
并且我尝试测试IntersectionObserver.观察调用,如下所示:
it('should create an observer if IntersectionObserver is available', async () => {
await newSpecPage({
components: [UIImageComponent],
html: `<ui-image alt="Lorem ipsum dolor sit amet" src="http://image.example.com"></ui-image>`
});
const mockObserveFn = () => {
return {
observe: jest.fn(),
unobserve: jest.fn()
};
};
window.IntersectionObserver = jest
.fn()
.mockImplementation(mockObserveFn);
const imageComponent = new UIImageComponent();
imageComponent.src = 'http://image.example.com';
const mockImg = document.createElement('img');
mockImg.setAttribute('src', null);
mockImg.setAttribute('class', 'lazy-img');
imageComponent.element.shadowRoot['querySelector'] = jest.fn(() => {
return mockImg;
});
expect(imageComponent.image).toBeNull();
imageComponent.componentDidLoad();
expect(mockObserveFn['observe']).toHaveBeenCalled();
});
但是不能让它工作,我的mockObserveFn.observe没有被调用,任何建议
4条答案
按热度按时间qvtsj1bj1#
您的
mockObserveFn.observe
尚未被调用,因为它不存在。可能会出现以下错误:
您可以像这样定义mock
然后你可以期待:
bxjv4tth2#
这个解决方案对我很有效。
基本上,您只需将IntersectionMock放在Each之前
vd8tlhqk3#
我建议使用维护良好的npm库jsdom-testing-mocks,而不是这些自定义解决方案。
at0kjp5o4#
实际上不应该调用处理程序,但这是我可以触发它的方式,因为我们不能真正触发视图。