import React from 'react'; import { mount } from 'enzyme'; import { act } from 'react-dom/test-utils'; import useDebouncProps from '../src/useDebounceProps'; jest.useFakeTimers(); type Props = { text: any; }; function Component({ text }: Props) { const [value] = useDebouncProps(text, 1000); return
{value}
; } describe('useDebounceProps Hook', () => { test('set initial value in first render', () => { const component = mount(); expect(component.text()).toBe('Hello'); }); test('update value when after debounce timer end', () => { const component = mount(); expect(component.text()).toBe('Moi'); // update props act(() => { component.setProps({ text: 'Hi, World!' }); }); expect(component.text()).toBe('Moi'); // timer act(() => { jest.setTimeout(500); }); // before Debounce Timer end. expect(component.text()).toBe('Moi'); act(() => { jest.runAllTimers(); }); // after Debounce Timer ended, update text expect(component.text()).toBe('Hi, World!'); }); test('cancel to debouce update', () => { function Component({ text }: Props) { const [value, cancel] = useDebouncProps(text, 1000); return
cancel()}>{value}
; } const component = mount(); expect(component.text()).toBe('Hi'); // update props act(() => { component.setProps({ text: 'Hello!' }); }); // timer act(() => { jest.setTimeout(500); }); // before debounce Timer end expect(component.text()).toBe('Hi'); // cancel event act(() => { component.simulate('click'); jest.runAllTimers(); }); // after debouce Timer ended. expect(component.text()).toBe('Hi'); }); });