LoginSignup
1
0

More than 1 year has passed since last update.

【Flutter】テストでMockからreturnされる値をTimerで切り替える。

Posted at

こんにちは。

アプリを13本リリースしているYuKiOです。

今回はFlutterのUnit Test時に、Mockから返される値をTimerで切り替える方法を紹介します。

どんな場合に必要?

それ、修学旅行で買った木刀のように、いつ必要になるんだ?と思われるかもしれませんが、非同期で画像をダウンロードしてくる場合などを想定しています。

・ダウンロードが完了するまでは、progressを表示
・ダウンロードが完了したら画像を表示
・タイムオーバーになったら、noimage & エラー処理 or 再取得

のような仕様です。

結論

結論で言えば、TimerによってStabを上書きしてしまうことで実現します。

mockは、mockitoというpubを使用しています。
https://pub.dev/packages/mockito

post_image_test.dart
 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のテスト作成の参考になれば幸いです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0