我的应用程序中有一个(写得相当糟糕的)javascript 组件,它处理无限滚动分页,我正在尝试重写它以使用 IntersectionObserver
,如此处 所述,但是我在测试中遇到问题它。
有没有办法在 QUnit 测试中驱动观察者的行为,即用我的测试中描述的一些条目触发观察者回调?
我想到的一个可能的解决方案是在组件的原型中公开回调函数并在我的测试中直接调用它,如下所示:
InfiniteScroll.prototype.observerCallback = function(entries) {
//handle the infinite scroll
}
InfiniteScroll.prototype.initObserver = function() {
var io = new IntersectionObserver(this.observerCallback);
io.observe(someElements);
}
//In my test
var component = new InfiniteScroll();
component.observerCallback(someEntries);
//Do some assertions about the state after the callback has been executed
我不太喜欢这种方法,因为它暴露了组件在内部使用 IntersectionObserver
的事实,这是一个实现细节,我认为客户端代码不应该看到它,所以有没有更好的方法测试这个?
对不使用 jQuery 的解决方案的额外喜爱 :)
原文由 Raibaz 发布,翻译遵循 CC BY-SA 4.0 许可协议
这是基于先前答案的另一种选择,您可以在
beforeEach
方法中或在.test.js
文件的开头运行它。You could also pass parameters to the
setupIntersectionObserverMock
to mock theobserve
and/orunobserve
methods to spy on them with ajest.fn()
mock function .对于打字稿: