Как заставить тест виджета ждать, пока Blo c не обновит состояние? - PullRequest
3 голосов
/ 23 января 2020

У меня есть 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(); в начало нашей основной. Но это не похоже на хорошее решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...