Когда мы тестируем компоненты React с использованием библиотеки testing-library, иногда нам нужно дождаться изменения состояния или обновления компонента после события пользователя, такого как клик.
Чтобы выполнить такое ожидание, мы можем воспользоваться асинхронными функциями и инструментами, предоставляемыми testing-library.
Одно из возможных решений - использование асинхронной функции "act" из библиотеки testing-library/react. Эта функция позволяет нам симулировать асинхронные действия и дождаться их выполнения перед продолжением теста.
Пример кода может выглядеть следующим образом:
import React from 'react'; import { render, fireEvent, act } from '@testing-library/react'; import MyComponent from './MyComponent'; test('дождаться изменения состояния после клика', async () => { const { getByTestId } = render(<MyComponent />); const button = getByTestId('my-button'); // Симуляция клика на кнопку fireEvent.click(button); // Ожидание изменения состояния с помощью act await act(async () => { // Внутри этой функции происходит ожидание и обновление // состояния компонента и всех эффектов, // которые могут быть вызваны этим обновлением }); // Проверка, что состояние изменилось, например: expect(myComponentState).toBe('some value'); });
В этом примере мы создаем тестовый компонент MyComponent и рендерим его с помощью render из testing-library/react. Затем мы получаем кнопку из компонента с помощью getByTestId и симулируем клик на нее с помощью fireEvent.click.
Затем мы используем асинхронную функцию act и оборачиваем ожидание изменения состояния внутри нее. Внутри этой функции происходит ожидание и обновление состояния компонента и всех эффектов, вызванных этим обновлением.
После завершения работы act мы можем выполнить любые проверки, которые нужны после обновления состояния компонента. В этом примере мы проверяем, что состояние myComponentState изменилось на 'some value'.
Важно отметить, что использование act и ожидание изменения состояния может быть необходимо только в случае, если обновление компонента вызывает асинхронные эффекты, например, запросы к серверу или таймеры. Если обновление компонента вызывает только синхронные эффекты, тогда ожидать изменения состояния не требуется.