gongxiangp2/components/home/LoadMoreTrigger.test.tsx
2026-08-21 12:53:28 +08:00

85 lines
2.1 KiB
TypeScript

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(
<LoadMoreTrigger
hasMore
isLoading={false}
disabled
onLoadMore={onLoadMore}
/>,
)
expect(IntersectionObserverMock.instances).toHaveLength(0)
rerender(
<LoadMoreTrigger
hasMore
isLoading={false}
disabled={false}
onLoadMore={onLoadMore}
/>,
)
expect(IntersectionObserverMock.instances).toHaveLength(1)
act(() => IntersectionObserverMock.instances[0].trigger(true))
expect(onLoadMore).toHaveBeenCalledTimes(1)
})
test('筛选刷新开始时断开已有的懒加载观察器', () => {
const onLoadMore = jest.fn()
const { rerender } = render(
<LoadMoreTrigger
hasMore
isLoading={false}
onLoadMore={onLoadMore}
/>,
)
const observer = IntersectionObserverMock.instances[0]
rerender(
<LoadMoreTrigger
hasMore
isLoading={false}
disabled
onLoadMore={onLoadMore}
/>,
)
expect(observer.disconnect).toHaveBeenCalledTimes(1)
})
})