测试react-infinite-scroller的loadMore方法不触发如何解决?
react-infinite-scroller 测试触发loadMore回调方案
- 第一步:先确认你要触发滚动的容器是
InfiniteScroll的直接父元素,也就是你data-testid为paginated-list-testid的PaginatedList组件必须是直接包裹InfiniteScroll的容器,并且该容器设置了固定高度 +overflow: auto/scroll属性,这是useWindow设为false时组件生效的前提。 - 第二步:模拟滚动前先手动设置容器的三个关键尺寸属性,不能只修改scrollY:
// 先获取容器元素 const scrollContainer = screen.getByTestId('paginated-list-testid'); // 模拟容器内容总高度远大于可视高度 Object.defineProperty(scrollContainer, 'scrollHeight', { value: 10000, configurable: true }); // 模拟容器可视区域高度 Object.defineProperty(scrollContainer, 'clientHeight', { value: 1000, configurable: true }); // 设置滚动距离到接近底部,满足组件的触发阈值逻辑 scrollContainer.scrollTop = 9000;
- 第三步:手动触发scroll事件,
scrollY是window滚动场景下的属性,自定义容器滚动不需要传该参数:
fireEvent.scroll(scrollContainer); // 如果使用React Testing Library,触发后等待异步回调执行完成再做断言 await waitFor(() => { // 示例断言:验证repositoryA.next方法被调用 expect(mockRepositoryNext).toHaveBeenCalled(); });
额外注意点:
- 测试前要提前mock掉
this.repositoryA.next方法,避免触发真实接口请求- 测试执行前要确保传入的
externalCondition为true,且InfiniteScroll的hasMore属性也为true,两个条件任意一个不满足时,就算滚动到底部组件也不会触发loadMore回调- Jest的jsdom环境不会自动计算元素尺寸,必须手动通过
defineProperty定义相关尺寸属性才会生效,这是你之前直接设置scrollY不生效的核心原因
内容的提问来源于stack exchange,提问作者Alberto Herrera Vargas
相关产品推荐
相关产品推荐

