Files
hms/apps/web/src/hooks/useDebouncedValue.test.ts
iven 3177a704ff
Some checks failed
CI / rust-check (push) Has been cancelled
CI / rust-test (push) Has been cancelled
CI / frontend-build (push) Has been cancelled
CI / security-audit (push) Has been cancelled
test(web): exprEvaluator + useDebouncedValue 单元测试 — 24 个用例
exprEvaluator(19): 等值/不等/AND/OR/NOT/括号/短路运算/
  missing field/type coercion/visibleWhen 便捷函数。
useDebouncedValue(5): 初始值/防抖/快速更新重置/自定义延迟/数值类型。
2026-04-27 23:24:25 +08:00

79 lines
2.1 KiB
TypeScript

import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'
import { renderHook, act } from '@testing-library/react'
import { useDebouncedValue } from './useDebouncedValue'
describe('useDebouncedValue', () => {
beforeEach(() => {
vi.useFakeTimers()
})
afterEach(() => {
vi.useRealTimers()
})
it('returns initial value immediately', () => {
const { result } = renderHook(() => useDebouncedValue('hello'))
expect(result.current).toBe('hello')
})
it('debounces value updates', () => {
const { result, rerender } = renderHook(
({ value }) => useDebouncedValue(value, 300),
{ initialProps: { value: 'a' } },
)
expect(result.current).toBe('a')
rerender({ value: 'b' })
expect(result.current).toBe('a')
act(() => { vi.advanceTimersByTime(299) })
expect(result.current).toBe('a')
act(() => { vi.advanceTimersByTime(1) })
expect(result.current).toBe('b')
})
it('resets timer on rapid updates', () => {
const { result, rerender } = renderHook(
({ value }) => useDebouncedValue(value, 200),
{ initialProps: { value: 'a' } },
)
rerender({ value: 'b' })
act(() => { vi.advanceTimersByTime(100) })
rerender({ value: 'c' })
act(() => { vi.advanceTimersByTime(100) })
expect(result.current).toBe('a')
act(() => { vi.advanceTimersByTime(100) })
expect(result.current).toBe('c')
})
it('uses custom delay', () => {
const { result, rerender } = renderHook(
({ value }) => useDebouncedValue(value, 500),
{ initialProps: { value: 'x' } },
)
rerender({ value: 'y' })
act(() => { vi.advanceTimersByTime(499) })
expect(result.current).toBe('x')
act(() => { vi.advanceTimersByTime(1) })
expect(result.current).toBe('y')
})
it('works with numeric values', () => {
const { result, rerender } = renderHook(
({ value }) => useDebouncedValue(value, 100),
{ initialProps: { value: 0 } },
)
rerender({ value: 42 })
act(() => { vi.advanceTimersByTime(100) })
expect(result.current).toBe(42)
})
})