【问题标题】:Widget test a widget which uses WidgetsBinding.instance.addPostFrameCallback()小部件测试使用 WidgetsBinding.instance.addPostFrameCallback() 的小部件
【发布时间】:2019-12-27 23:25:42
【问题描述】:

我正在尝试对一个使用WidgetsBinding.instance.addPostFrameCallback() 的小部件进行小部件测试,以在小部件生命周期的一开始就显示一个对话框。

小部件工作正常,但我不知道如何进行小部件测试,因为测试的第一个 expect() 是在触发后帧之前执行的。

无论如何要“告诉”测试等到所有后帧都被调度?

PD:tester.pump()、tester.pumpAndSettle() 等工作。

【问题讨论】:

  • 我有同样的问题,很抱歉我不知道 ;-/

标签: flutter flutter-test


【解决方案1】:

要在颤振测试环境中安排帧(并强制调用postFrameCallback),您需要在tester.pump() 之前调用tester.binding.scheduleFrame()

或者,如果您不关心正在重建的整个小部件树,您可以调用 tester.pumpWidget(widget) 而不是 tester.pump()

示例测试:

testWidgets('testing frames', (tester) async {
  final w = Container();
  int framesCount = 0;

  tester.binding.addPersistentFrameCallback((timeStamp) {
    framesCount++;
  });

  await tester.pumpWidget(w);
  expect(framesCount, equals(1));

  // pumpWidget calls [scheduleFrame]
  await tester.pumpWidget(w);
  expect(framesCount, equals(2));

  await tester.pump();
  // no frame was scheduled, so framesCount is still 2
  expect(framesCount, equals(2));

  tester.binding.scheduleFrame(); // --
  await tester.pump();            //   |
  expect(framesCount, equals(3)); // <-

  // pumpWidget calls [scheduleFrame]
  await tester.pumpWidget(w);
  expect(framesCount, equals(4));
});

【讨论】:

    【解决方案2】:

    这对我有用:

    // press button
    await tester.tap(find.text("Save"));
    // await the flushbar or snackbar to appear
    await tester.pumpAndSettle(const Duration(seconds: 1));
    // find by text or key
    expect(find.text("Error saving note"), findsOneWidget);
    // this prevents this error:
    // A Timer is still pending even after the widget tree was disposed.
    // the flushbar in my code is displayed for 5 seconds. So we wait for it to 
    // go away.
    await tester.pumpAndSettle(const Duration(seconds: 5));
    

    我不知道这是否是正确的做法。但它有效。 祝你好运!

    【讨论】:

      【解决方案3】:

      但是你知道什么……突然就弹出来了:

          tester.binding.scheduleWarmUpFrame();
      

      运行那个:-)

      取自这里:https://chromium.googlesource.com/external/github.com/flutter/flutter/+/v0.9.2/packages/flutter/test/widgets/binding_test.dart

      【讨论】:

      • warmUpFrame 并不是您所需要的,因为它有一些初始化开销
      猜你喜欢
      • 2021-05-09
      • 2019-02-25
      • 1970-01-01
      • 2021-01-21
      • 2021-05-14
      • 2019-05-23
      • 2019-04-28
      • 2021-08-13
      • 1970-01-01
      相关资源
      最近更新 更多