😊

RiverpodでProviderがrefreshできたかのWidgetテスト

2021/11/29に公開

何がしたいか

  1. カートにアイテムを入れる
  2. カート画面で明細をタップ
  3. 数量変更の画面で変更ボタンを押して、カート画面に戻る
  4. 戻ったカート画面で数量更新を確認

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

ログインするとコメントできます