85 lines
2.1 KiB
TypeScript
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)
|
|
})
|
|
})
|