Flutter Widget 测试等待动画

not*_*eal 5 animation widget widget-test-flutter

我有一个类似于以下内容的小部件测试:

testWidgets('Widget test', (WidgetTester tester) async {
  provideMockedNetworkImages(() async {
    final widget = MyWidget();

    await WidgetTestFunctions.pumpWidgetTest(
      tester,
      widget,
    );

    // ....

    await tester.tap(find.byType(MyWidget));
    await tester.pump(new Duration(milliseconds: 3000));

    // ....

    expect(widget.value, myValue);
  });
});
Run Code Online (Sandbox Code Playgroud)

以及小部件 on-tap 方法的以下实现:

_onButtonPressed() async {      
  await animationController.forward();
  setState(() {
    // ...
    // Calls method that changes the widget value.
  });           
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,animationController.forward()在测试中调用该方法后,该setState部分未执行。我应该如何等待这个方法正确完成?在应用程序运行时,这部分代码被正确调用。

似乎await tester.pump(new Duration(milliseconds: 3000));工作不正常,动画的持续时间为 1500 毫秒,并且您可以看到泵持续时间是双倍的。

Val*_*nal 1

我遇到了同样的问题,这就是发生的事情。

当你这样做时

await animationController.forward();
Run Code Online (Sandbox Code Playgroud)

您等待的不是简单的Future<void>完成,而是TickerFuture(extends Future<void>)。

由于某种原因,在我的测试中,一些TickerFuture来自animationController.forward()weer 的 s 被取消了。

在 的文档中TickerProvider,它说:

如果 Ticker 在未停止的情况下被处置,或者如果在 cancelled 设置为 true 的情况下停止,则此 Future 将永远不会完成。

此类的工作方式与普通 Future 类似,但有一个附加属性 orCancel,该属性返回一个派生 Future,如果返回 TickerFuture 的 Ticker 被停止且取消设置为 true,或者如果它在未停止的情况下被处置,则该 Future 会以错误完成。

要在该 future 解决或取消股票代码时运行回调,请使用whenCompleteOrCancel。

现在的问题whenCompleteOrCancel是它会返回void(并不是Future<void>说我们不能等待它。

这就是我所做的(受到实现的启发whenCompleteOrCancel):

Future<void> thunk(dynamic value) {
  return;
}
final TickerFuture ticker = animationController.forward();
await ticker.onCancel.then(thunk, onError: thunk); // <- This resolves even if the ticker is canceled and the tests are not stuck anymore.
Run Code Online (Sandbox Code Playgroud)