くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

FlutterのUnit TestでDateTime.now()を固定する

FlutterのUnitTestのときに、現在時刻のテストをどうしようかなと、
いろいろ調べてみたときの備忘録(*´ω`*)

このあたりを使うとよいらしい

どちらも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));
    });
  });
}

以上!! 便利なやつがあってすてき(*´ω`*)

参考にしたサイトさま