Open2

Flutter+Riverpod:タイマーがどうのこうのでテストが失敗する件

kabeyakabeya

最初のうち通っていたテストがなんとなく通らなくなりました。

行番号とかはバージョンで違うのでしょうが。

テストケースの終わりに以下の2行を追加すると直ります。

// 残っているアニメーションやタイマーを処理
await tester.pumpWidget(Container());
await tester.pumpAndSettle();

Claudeいわく

  • RiverpodのAutoDisposeProviderに原因があるらしい
  • pumpWidget(Container())が効果的な理由
    • 既存のウィジェットツリーを空のコンテナに置き換える
    • これにより、Riverpodのプロバイダーを含む全てのウィジェットが破棄される
    • 特にAutoDisposeProviderの破棄処理が確実に実行される
  • pumpAndSettle()が効果的な理由
    • 残っているアニメーションやタイマーが完了するまで待機
    • 非同期処理が完全に終了するまでフレームを処理
    • Riverpodの自動破棄処理に関連するタイマーも確実に処理される

だそうです。

kabeyakabeya

それでもうまく行かないケースがありました。
以下のようなコードをClaudeに提案されました。
これだとうまくいきますね。1秒待ちたくないんですけども。

// タイマーを確実に処理
await tester.pumpAndSettle(const Duration(seconds: 1));

// ウィジェットツリーを破棄する前にタイマーを処理
await tester.runAsync(() async {
  await tester.pumpWidget(Container());
  await tester.pumpAndSettle();
});