😊
RiverpodでProviderがrefreshできたかのWidgetテスト
何がしたいか
- カートにアイテムを入れる
- カート画面で明細をタップ
- 数量変更の画面で変更ボタンを押して、カート画面に戻る
- 戻ったカート画面で数量更新を確認
3→4で子から親画面をUPATEする必要があるので、変更ボタン押下時にref.refresh(hogeProvider)
って書いている。Navigator#pop
で戻った時はautoDispose
にしても、リフレッシュが走らずキャッシュされるので、refreshしてFutureProvider自身の初期化処理がもう1回走らせている。
FutureProviderで管理してるStateを取得する処理は、ProviderでちゃんとDIしている。こんな感じ。
final cartController = FutureProvider.autoDispose<CartState>((ref) {
return ref.watch(fooService).getCart();
});
getCart
をMockするわけなんだけど、thenAnswer
は上書きできるので、こんな感じでやり取りすれば、テストとしては正しいと思われる。
//初期化
when(f.getCart).thenAnswer((_) => Future.value(initState));
//子画面に行く処理
await tester.tap(////);
//タップして数量更新する前に差し替える
when(f.getCart).thenAnswer((_) => Future.value(updateState));
//更新して親画面に戻る
await tester.tap(////);
//updateStateどおりにウィジェットが更新されたかを確認しておく
取り留めもない話。
Discussion