У меня есть EmailScreen
(виджет с отслеживанием состояния), в котором есть ввод текста и кнопка. Кнопка активируется только при вводе действительного электронного письма.
Я использую Blo c, и на моем экране отображаются InitialEmailState
и ValidEmailInputState
, и он отлично работает, когда я запускаю приложение.
В моем тесте виджетов второе ожидание не выполняется до того, как blo c сможет обновить состояние:
testWidgets('when valid email is input, button is enabled', (tester) async {
const validEmail = 'email@provider.com';
emailBloc.listen((event) {
print('NEW EVENT: ' + event.toString());
});
await bootUpWidget(tester, emailScreen);
final BottomButton button = tester.widget(
find.widgetWithText(BottomButton, 'CONTINUE'));
expect(button.enabled, isFalse);
await tester.enterText(find.byType(TextInputScreen), validEmail);
await tester.pumpAndSettle();
expect(button.enabled, isTrue);
});
И вот что я получаю:
NEW EVENT: InitialEmailState
══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════════════════════
The following TestFailure object was thrown running a test:
Expected: true
Actual: <false>
...
The test description was:
when valid email is input, button is enabled
════════════════════════════════════════════════════════════════════════════════════════════════════
Test failed. See exception logs above.
The test description was: when valid email is input, button is enabled
NEW EVENT: InputValidEmailState
✖ when valid email is input, button is enabled
Exited (1)
Как видите, он печатает исходное состояние, не выполняет второе ожидание, а затем печатает ожидаемое состояние.
Заранее спасибо:)
== ОБНОВЛЕНИЕ ==
Нам удалось заставить это работать, добавив LiveTestWidgetsFlutterBinding();
в начало нашей основной. Но это не похоже на хорошее решение.