Выбор ответа Junior Тестирование обновлено

Flutter: виджет-тест без MaterialApp

Вопрос

Тест pumpWidget(const LoginForm()) падает с ошибкой «No MediaQuery widget ancestor found» или «No Directionality widget found». Как исправить?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Обернуть виджет в MaterialApp (и нужные провайдеры), он даёт эти виджеты. Многие виджеты ожидают предков, которые обычно создаёт MaterialApp: MediaQuery, Directionality, Theme, Navigator, локализацию.

Варианты ответа

  1. Запускать такой тест только на устройстве, где эти виджеты создаёт система
  2. Добавить WidgetsFlutterBinding.ensureInitialized() в начало теста
  3. Обернуть виджет в MaterialApp (и нужные провайдеры), он даёт эти виджетыправильный ответ
  4. Пометить тест skip: true: формы без MaterialApp протестировать нельзя

Разбор

Многие виджеты ожидают предков, которые обычно создаёт MaterialApp: MediaQuery, Directionality, Theme, Navigator, локализацию. В тесте их нет, пока не обернуть. Устройство не нужно, а testWidgets и так инициализирует тестовый биндинг.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.