waitForElementToBeRemoved — это утилита из React Testing
Library, предназначенная для асинхронного тестирования компонентов, в
которых элементы DOM исчезают с течением времени. Она упрощает проверку
динамических изменений интерфейса, таких как закрытие модальных окон,
удаление уведомлений, скрытие индикаторов загрузки и другие сценарии,
где элемент должен исчезнуть после определённого события.
await waitForElementToBeRemoved(callbackOrElement, options)
callbackOrElement:
Функция, возвращающая DOM-элемент (или массив элементов), который должен исчезнуть, например:
() => screen.getByText('Loading...')Или сам элемент/массив элементов напрямую:
const loader = screen.getByTestId('loader');
await waitForElementToBeRemoved(loader);options (необязательно):
timeout — максимальное время ожидания в миллисекундах
(по умолчанию 1000).interval — интервал проверки DOM (по умолчанию
50).waitForElementToBeRemoved выполняет периодическую
проверку DOM до тех пор, пока указанный элемент не исчезнет. Если за
указанное время элемент не исчез, утилита выбрасывает ошибку. В отличие
от обычного waitFor, она специализирована именно для
удаления элементов, что делает тесты более читаемыми и точными.
import { render, screen, waitForElementToBeRemoved } from '@testing-library/react';
import LoaderComponent from './LoaderComponent';
test('спиннер исчезает после загрузки данных', async () => {
render(<LoaderComponent />);
const spinner = screen.getByTestId('loader');
expect(spinner).toBeInTheDocument();
await waitForElementToBeRemoved(spinner);
expect(screen.queryByTestId('loader')).toBeNull();
expect(screen.getByText('Данные загружены')).toBeInTheDocument();
});
В этом примере:
toBeInTheDocument).waitForElementToBeRemoved ждёт исчезновения
спиннера.Функцию удобно применять, когда элемент может появляться и исчезать динамически:
await waitForElementToBeRemoved(() => screen.queryByText('Загрузка...'));
queryByText возвращает null, если элемент
отсутствует.timeout.При взаимодействии с пользователем часто нужно дождаться удаления элемента после действия:
import { render, screen, waitForElementToBeRemoved } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import Notification from './Notification';
test('уведомление закрывается после клика', async () => {
render(<Notification message="Успех!" />);
const closeButton = screen.getByRole('button', { name: /закрыть/i });
userEvent.click(closeButton);
await waitForElementToBeRemoved(() => screen.queryByText('Успех!'));
expect(screen.queryByText('Успех!')).toBeNull();
});
Здесь проверяется:
click).waitForElementToBeRemoved работает и с массивами:
const items = screen.getAllByTestId('list-item');
await waitForElementToBeRemoved(items);
Элементы исчезают один за другим, и утилита завершит выполнение только когда все элементы массива удалены.
await waitForElementToBeRemoved(() => screen.queryByText('Загрузка...'), {
timeout: 3000, // ждём до 3 секунд
interval: 100 // проверка каждые 100 мс
});
Использование getBy* вместо
queryBy* в колбэке:
getBy* выбросит исключение, если элемент
отсутствует.queryBy*, чтобы вернуть
null при отсутствии элемента.Не дожидаться промиса:
waitForElementToBeRemoved возвращает
Promise. Нужно использовать await.await тест может завершиться раньше времени и дать
ложноположительный результат.Попытка удалить уже отсутствующий элемент:
waitForwaitFor — универсальный инструмент для ожидания
любого условия, возвращает значение функции, повторяя
проверки.waitForElementToBeRemoved — специализирован для
исчезновения элементов, делает код короче и
выразительнее, повышая читаемость теста.queryBy* в колбэке.timeout для медленных API-запросов, чтобы
избежать случайных падений тестов.waitForElementToBeRemoved значительно упрощает
тестирование асинхронных сценариев, где важен момент исчезновения
элемента. Он делает код тестов более декларативным и легко читаемым,
снижая риск ошибок, связанных с неправильной синхронизацией.