こんにちは。
アプリを13本リリースしているYuKiOです。
HackerMemoを大幅にアップデートしたので、
— YuKiO|アプリ個人開発|Flutter × Firebase (@oo_forward) January 10, 2021
海外向けのPVを作ってみました😆
夜なべして頑張って作ったので、拡散頂けたら泣いて喜びます😭🙏
音有りがオススメです!
元ネタわかる人いるかな〜🤔
アプリはこちら🔽
■iPhoneの方https://t.co/6T10L94Ld1
■Androidの方https://t.co/uBevCXrNw2 pic.twitter.com/wiGLv46kaG
今回はFlutterのUnit Test時に、Mockから返される値をTimerで切り替える方法を紹介します。
どんな場合に必要?
それ、修学旅行で買った木刀のように、いつ必要になるんだ?と思われるかもしれませんが、非同期で画像をダウンロードしてくる場合などを想定しています。
・ダウンロードが完了するまでは、progressを表示
・ダウンロードが完了したら画像を表示
・タイムオーバーになったら、noimage & エラー処理 or 再取得
のような仕様です。
結論
結論で言えば、TimerによってStabを上書きしてしまうことで実現します。
mockは、mockitoというpubを使用しています。
https://pub.dev/packages/mockito
test(
"ダウンロードが完了すると、trueが返ってくる。",
() async {
final File mockFile = MockFile();
when(mockFile.existsSync()).thenAnswer((_) => false);
Timer(Duration(seconds: 7), () {
when(mockFile.existsSync()).thenAnswer((_) => true);
});
final result = await postImage.isExsitsImage(mockFile);
expect(result, true);
},
);
一見、Whenの処理内できそうなように思えましたが、処理が確定されてしまうようで、書き換えることができませんでした。
isExsitsImageの処理では画像が存在しない場合にはwhileで一定間隔で画像の存在チェックを行い、一定時間が経過して画像がない場合にはfalse、画像がある場合にはtrueを返す処理をしています。
少してもFlutterのテスト作成の参考になれば幸いです。