FlutterのUnitTestのときに、現在時刻のテストをどうしようかなと、
いろいろ調べてみたときの備忘録(*´ω`*)
このあたりを使うとよいらしい
- clock | Dart package
- テストしやすいDateTime.nowのパッケージ
- fake_async | Dart package
- Future/Stream/Timerなどの非同期のテストの便利パッケージ
どちらもDartチームのパッケージなので、安心感ある
インストール
まずはインストール
$ fvm flutter pub add clock dev:fake_async
プロダクトコード
実際のコードはこんな感じで、
DateTime.now()
の代わりに、
clock.now()
を利用すればOK
import 'package:clock/clock.dart'; DateTime getNow() { // DateTime.now()の代わりにclock.now() return clock.now(); }
Testコード(fake_async版)
テストコードはこんな感じ。
fakeAsync
で時刻を指定して、テストコードを書けばOK。
fakeAsync
内で現在時刻を設定してくれる。
import 'package:fake_async/fake_async.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { test('datetime.now', () { // 固定したい日時 final initialTime = DateTime(2024, 1, 1); // fackAsync版 fakeAsync(initialTime: initialTime, (_) { expect(getNow(), DateTime(2024, 1, 1)); }); }); }
Testコード(clock版)
fakeAsync
なし版のテストコード。
fakeAsync
の内部では、withClock
を使っているので、
そのまま抜き出してきた感じ。
これだと、clock
パッケージだけで書ける
import 'package:clock/clock.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { test('datetime.now', () { // 固定したい日時 final initialTime = DateTime(2024, 1, 1); // fakeAsyncがなくても、withClockでもOK withClock(Clock.fixed(initialTime), () { expect(getNow(), DateTime(2024, 1, 1)); }); }); }
以上!! 便利なやつがあってすてき(*´ω`*)