import { renderHook, act } from '@testing-library/react-hooks'; import { useAsyncLoading } from '../use-async-loading'; import { isPromise } from '../../utils/is-promise'; import { isFunction } from 'lodash'; jest.mock('lodash', () => ({ isFunction: jest.fn(), })); jest.mock('../../utils/is-promise', () => ({ isPromise: jest.fn(), })); describe('useAsyncLoading 自定义 Hooks 单元测试', () => { it('未传入asyncLoading', () => { const { result } = renderHook(() => useAsyncLoading({ loading: false })); expect(result.current.loading).toBe(false); expect(result.current.onClick).toBeUndefined(); }); it('asyncLoading 为 true 且 onClick 是一个函数时触发加载', () => { (isFunction as unknown as jest.Mock).mockReturnValue(true); const onClickMock = jest.fn(); const { result } = renderHook(() => useAsyncLoading({ asyncLoading: true, onClick: onClickMock, }), ); act(() => { result.current.onClick(); }); expect(result.current.loading).toBe(false); expect(onClickMock).toHaveBeenCalled(); }); it('asyncLoading 为 true 且 onClick 返回一个 promise', async () => { (isFunction as unknown as jest.Mock).mockReturnValue(true); (isPromise as unknown as jest.Mock).mockReturnValue(true); const onClickMock = jest.fn().mockReturnValue(Promise.resolve()); const { result, waitForNextUpdate } = renderHook(() => useAsyncLoading({ asyncLoading: true, onClick: onClickMock }), ); act(() => { result.current.onClick(); }); expect(result.current.loading).toBe(true); // Waiting for promise to resolve await waitForNextUpdate(); expect(result.current.loading).toBe(false); }); it('asyncLoading 为 false 即使提供了 onClick', () => { (isFunction as unknown as jest.Mock).mockReturnValue(true); const onClickMock = jest.fn(); const { result } = renderHook(() => useAsyncLoading({ asyncLoading: false, onClick: onClickMock, }), ); act(() => { result.current.onClick(); }); // Since asyncLoading is false, loading shouldn't be affected expect(result.current.loading).toBe(undefined); expect(onClickMock).toHaveBeenCalled(); }); it('loading 属性用于初始状态', () => { const { result } = renderHook(() => useAsyncLoading({ loading: true })); expect(result.current.loading).toBe(true); }); });