Widget 测试使用 WidgetsBinding.instance.addPostFrameCallback() 的



我正在尝试对一个小部件进行一个小部件测试,该小部件使用WidgetsBinding.instance.addPostFrameCallback((在小部件生命周期的最初阶段显示一个对话框。

小部件工作正常,但我无法弄清楚如何进行小部件测试,因为测试的第一个 expect(( 是在触发此后帧之前执行的。

无论如何要"告诉"测试等到所有后期帧都派出?

PD:tester.pump((, tester.pumpAndSettle(( 等不工作。

但是你知道什么...突然它弹出:

tester.binding.scheduleWarmUpFrame();

运行那个:-(

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

要在颤振测试环境中调度帧(并强制调用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));
});

这对我有用:

// 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));

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

相关内容

  • 没有找到相关文章

最新更新