Код-ревью Middle Тестирование обновлено

Код-ревью: widget-тест экрана входа

Вопрос

Тест экрана входа. Найдите проблемы.

testWidgets('вход', (tester) async {
  await tester.pumpWidget(LoginPage(api: RealApi()));
  await tester.enterText(find.byType(TextField).at(0), 'user@mail.ru');
  await tester.enterText(find.byType(TextField).at(1), 'secret');
  await tester.tap(find.text('Войти'));
  await Future.delayed(const Duration(seconds: 2));
  expect(find.text('Добро пожаловать'), findsWidgets);
});

Коротко

Хороший widget-тест: MaterialApp с подменёнными зависимостями, поиск по ключам, прокачка кадров через pump, точные матчеры и проверка взаимодействия с моком (verify(() = api.login(...)).called(1)).

Что должен найти ревьюер

  1. Ошибкастрока 2
    Нет MaterialApp: виджеты не найдут MediaQuery, Directionality и навигатор.
  2. Ошибкастрока 2
    Реальный API в тесте: сеть, нестабильность и зависимость от сервера. Нужен мок или фейк.
  3. Стильстрока 3
    Поиск по индексу TextField хрупкий: добавят поле, и тест сломается. Использовать ключи.
  4. Ошибкастрока 6
    Future.delayed не двигает кадры в виджет-тесте и может зависнуть при фейковом времени: нужен pump/pumpAndSettle.
  5. Стильстрока 7
    findsWidgets слишком слабая проверка: нужен findsOneWidget и проверка вызова API с правильными данными.

Разбор

Хороший widget-тест: MaterialApp с подменёнными зависимостями, поиск по ключам, прокачка кадров через pump, точные матчеры и проверка взаимодействия с моком (verify(() => api.login(...)).called(1)).

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

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