如何使用未解决的 Future 对 FutureBuilder 进行小部件测试

svi*_*i3c 5 flutter flutter-test

我想知道如何在 flutter 小部件测试中尚未完成未来的情况下测试案例。

只要未来未解决,小部件就应该显示一个微调器。

我试过这个测试用例:

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);
  },
);
Run Code Online (Sandbox Code Playgroud)

结果:未来解决,期望落空。

注意:withApp 初始化一个带有本地化的应用程序。因此,我必须打电话tester.pumpAndSettle()等待 l10n。

svi*_*i3c 3

我找到了 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);
  },
);
Run Code Online (Sandbox Code Playgroud)