60 lines
1.3 KiB
TypeScript
60 lines
1.3 KiB
TypeScript
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
|
||
import { debounce } from './debounce'
|
||
|
||
describe('debounce', () => {
|
||
beforeEach(() => {
|
||
vi.useFakeTimers()
|
||
})
|
||
|
||
afterEach(() => {
|
||
vi.useRealTimers()
|
||
})
|
||
|
||
it('trailing edge(默认):多次调用后只触发一次,使用最后一次的参数', () => {
|
||
const fn = vi.fn()
|
||
const debouncedFn = debounce(fn, 100)
|
||
|
||
debouncedFn('first')
|
||
debouncedFn('second')
|
||
debouncedFn('last')
|
||
|
||
expect(fn).not.toHaveBeenCalled()
|
||
|
||
vi.advanceTimersByTime(100)
|
||
|
||
expect(fn).toHaveBeenCalledTimes(1)
|
||
expect(fn).toHaveBeenCalledWith('last')
|
||
})
|
||
|
||
it('cancel:取消后计时器到期不执行', () => {
|
||
const fn = vi.fn()
|
||
const debouncedFn = debounce(fn, 100)
|
||
|
||
debouncedFn()
|
||
debouncedFn.cancel()
|
||
|
||
vi.advanceTimersByTime(100)
|
||
|
||
expect(fn).not.toHaveBeenCalled()
|
||
})
|
||
|
||
it('flush:立即执行待执行的调用并传递参数', () => {
|
||
const fn = vi.fn()
|
||
const debouncedFn = debounce(fn, 100)
|
||
|
||
debouncedFn('arg1')
|
||
debouncedFn.flush()
|
||
|
||
expect(fn).toHaveBeenCalledWith('arg1')
|
||
})
|
||
|
||
it('leading edge:第一次调用立即执行', () => {
|
||
const fn = vi.fn()
|
||
const debouncedFn = debounce(fn, 100, { edges: ['leading'] })
|
||
|
||
debouncedFn()
|
||
|
||
expect(fn).toHaveBeenCalledTimes(1)
|
||
})
|
||
})
|