import { render, screen, waitForElementToBeRemoved, } from '@testing-library/react'; import React, { ComponentType, Suspense } from 'react'; import Loadable from './index'; // Sample component to be loaded lazily function SampleComponent(): JSX.Element { return
Sample Component
; } const loadSampleComponent = (): Promise<{ default: ComponentType; }> => new Promise<{ default: ComponentType }>((resolve) => { setTimeout(() => { resolve({ default: SampleComponent }); }, 500); }); describe('Loadable', () => { it('should render the lazily loaded component', async () => { const LoadableSampleComponent = Loadable(loadSampleComponent); const { container } = render( Loading...}> , ); expect(screen.getByText('Loading...')).toBeInTheDocument(); await waitForElementToBeRemoved(() => screen.queryByText('Loading...')); expect(container.querySelector('div')).toHaveTextContent('Sample Component'); }); it('should call lazy with the provided import path', () => { const reactLazySpy = jest.spyOn(React, 'lazy'); Loadable(loadSampleComponent); expect(reactLazySpy).toHaveBeenCalledTimes(1); expect(reactLazySpy).toHaveBeenCalledWith(expect.any(Function)); reactLazySpy.mockRestore(); }); });