Как проверить виджет FutureBuilder с нерешенным Future - PullRequest
0 голосов
/ 24 сентября 2018

Интересно, как я могу протестировать случай, когда будущее еще не завершено в тестах виджетов флаттера.

Виджет должен показывать счетчик, пока будущее не разрешено.

Iиспользуйте этот тестовый пример:

testWidgets(
  'should show a spinner when loading',
  (WidgetTester tester) async {
    when(valueRepository.getValues())
        .thenAnswer((_) => Future.delayed(Duration(seconds: 30), () => []));
    await tester.pumpWidget(withApp(ValueListPage(
      valueRepository: valueRepository,
    )));

    await tester.pumpAndSettle(
        Duration(seconds: 10), EnginePhase.build, Duration(minutes: 1));

    expect(find.byType(CircularProgressIndicator), findsOneWidget);
  },
);

Результат: будущее разрешается, и ожидание не выполняется.

Примечание: withApp инициализирует приложение с локализацией.Из-за этого мне нужно позвонить tester.pumpAndSettle(), чтобы дождаться l10n.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Я нашел рабочее решение с помощью fakeAsync:

testWidgets(
  'should show a spinner when loading',
  (WidgetTester tester) async {
      when(valueRepository.getValues()).thenAnswer(
          (_) => Future.delayed(Duration(seconds: 1), () => []));
      await tester.pumpWidget(withApp(ValueListPage(
        valueRepository: valueRepository,
      )));

      await tester.pump();

      expect(find.byType(CircularProgressIndicator), findsOneWidget);
      await tester.pumpAndSettle();
      expect(find.byType(CircularProgressIndicator), findsNothing);
  },
);
0 голосов
/ 24 сентября 2018

Try

testWidgets(
  'should show a spinner when loading',
  (WidgetTester tester) async {
    tester.runAsync(() async {
      when(valueRepository.getValues())
          .thenAnswer((_) => Future.delayed(Duration(seconds: 30), () => []));
      await tester.pumpWidget(withApp(ValueListPage(
        valueRepository: valueRepository,
      )));

      await tester.pumpAndSettle(
          Duration(seconds: 10), EnginePhase.build, Duration(minutes: 1));

      expect(find.byType(CircularProgressIndicator), findsOneWidget);
    });
  },
);

Тесты по умолчанию запускаются с fakeAsync, и некоторые асинхронные коды не работают должным образом с fakeAsync.

...