import { act, render } from '@testing-library/react' import LoadMoreTrigger from '@/components/home/LoadMoreTrigger' type ObserverCallback = IntersectionObserverCallback class IntersectionObserverMock { static instances: IntersectionObserverMock[] = [] callback: ObserverCallback observe = jest.fn() disconnect = jest.fn() unobserve = jest.fn() takeRecords = jest.fn(() => []) root = null rootMargin = '' thresholds = [0] constructor(callback: ObserverCallback) { this.callback = callback IntersectionObserverMock.instances.push(this) } trigger(isIntersecting: boolean) { this.callback([{ isIntersecting } as IntersectionObserverEntry], this as unknown as IntersectionObserver) } } describe('LoadMoreTrigger', () => { beforeEach(() => { IntersectionObserverMock.instances = [] window.IntersectionObserver = IntersectionObserverMock as unknown as typeof IntersectionObserver }) test('筛选刷新期间不启动懒加载,刷新结束后恢复观察', () => { const onLoadMore = jest.fn() const { rerender } = render( , ) expect(IntersectionObserverMock.instances).toHaveLength(0) rerender( , ) expect(IntersectionObserverMock.instances).toHaveLength(1) act(() => IntersectionObserverMock.instances[0].trigger(true)) expect(onLoadMore).toHaveBeenCalledTimes(1) }) test('筛选刷新开始时断开已有的懒加载观察器', () => { const onLoadMore = jest.fn() const { rerender } = render( , ) const observer = IntersectionObserverMock.instances[0] rerender( , ) expect(observer.disconnect).toHaveBeenCalledTimes(1) }) })