Код-ревью 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)).
Что должен найти ревьюер
- Ошибкастрока 2Нет
MaterialApp: виджеты не найдутMediaQuery,Directionalityи навигатор. - Ошибкастрока 2Реальный API в тесте: сеть, нестабильность и зависимость от сервера. Нужен мок или фейк.
- Стильстрока 3Поиск по индексу
TextFieldхрупкий: добавят поле, и тест сломается. Использовать ключи. - Ошибкастрока 6
Future.delayedне двигает кадры в виджет-тесте и может зависнуть при фейковом времени: нуженpump/pumpAndSettle. - Стильстрока 7
findsWidgetsслишком слабая проверка: нуженfindsOneWidgetи проверка вызова API с правильными данными.
Разбор
Хороший widget-тест: MaterialApp с подменёнными зависимостями, поиск по ключам, прокачка кадров через pump, точные матчеры и проверка взаимодействия с моком (verify(() => api.login(...)).called(1)).
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.