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

最初のうち通っていたテストがなんとなく通らなくなりました。
行番号とかはバージョンで違うのでしょうが。
テストケースの終わりに以下の2行を追加すると直ります。
// 残っているアニメーションやタイマーを処理
await tester.pumpWidget(Container());
await tester.pumpAndSettle();
Claudeいわく
- Riverpodの
AutoDisposeProvider
に原因があるらしい -
pumpWidget(Container())
が効果的な理由- 既存のウィジェットツリーを空のコンテナに置き換える
- これにより、Riverpodのプロバイダーを含む全てのウィジェットが破棄される
- 特に
AutoDisposeProvider
の破棄処理が確実に実行される
-
pumpAndSettle()
が効果的な理由- 残っているアニメーションやタイマーが完了するまで待機
- 非同期処理が完全に終了するまでフレームを処理
- Riverpodの自動破棄処理に関連するタイマーも確実に処理される
だそうです。

それでもうまく行かないケースがありました。
以下のようなコードをClaudeに提案されました。
これだとうまくいきますね。1秒待ちたくないんですけども。
// タイマーを確実に処理
await tester.pumpAndSettle(const Duration(seconds: 1));
// ウィジェットツリーを破棄する前にタイマーを処理
await tester.runAsync(() async {
await tester.pumpWidget(Container());
await tester.pumpAndSettle();
});