【Flutter】pumpメソッドについてのまとめ・使用例

Flutter基礎

flutterのtestについてのまとめで今回はpumpについてまとめました。

概要

pumpメソッドとは

  • test環境でframeを描画(発火)させる
  • Duration引数を設定した場合、与えらたら秒数後に描画

jank

  • pumpメソッドは与えられた時間ジャンクしたように見せる
    • Jank とはアプリが滑らかに描画できず、フレームを落とす(描画間隔が遅れる)こと。
    • 例:本来 60fps で描画すべきが、処理が重くて 16ms の間に描画できず、次のタイミングまでスキップしてしまう。

使用例

使用するテスト

  • Providerでエラーをわざと吐き出す
  • エラーのテキストをチェックするテスト

ソースコード

  testWidgets('エラーならエラーテキストを表示', (tester) async {
    await tester.pumpWidget(
      ProviderScope(overrides: [
        authStateProvider.overrideWith(
          (ref) => Stream.error('error'),
        ),
      ], child: const MaterialApp(home: App())),
    );

    await tester.pump();

    expect(
        find.text('Error occurred while checking user status'), findsOneWidget);
  });

ここでのpumpの役割

  • test.pumpWidgetでUIを構築
    • ただ、authStateProviderは非同期なのでまだエラーは流れていない
  • pumpをすることで
    • もう一度描画し「次のフレームまで時間が進んだ」ことをシュミレート
    • Stream.error('error') が即座に発火しても、それに伴う setState / Provider の再ビルドは 次のフレームで反映されるので、ここで改めて描画が走る。
    • その結果、エラーテキストが UI に出てくる。

時間経過のイメージ

pumpWidget()
  └─ 初期描画(Stream 監視開始)

pump()
  └─ 1フレーム進める
      ├─ Stream が error イベントを流す
      ├─ Provider が再ビルドをトリガー
      └─ エラーメッセージ描画

結論

  • pump は「時間経過や次フレームの発生をシミュレーションして、非同期処理の結果を反映させた描画」を実行できる
  • そのため、Future や Stream による状態変化、アニメーション、遅延処理などをテストで再現する際に必須となる
  • pump = テスト環境でUIを進めるスイッチのようなもの

コメント

タイトルとURLをコピーしました