How to test code that uses DateTime.now in Flutter?

As Günter said, the clock package, maintained by the Dart team, provides a very neat way to achieve this.

Normal usage:

import 'package:clock/clock.dart';

void main() {
  // prints current date and time
  print(clock.now());
}

Overriding the current time:

import 'package:clock/clock.dart';

void main() {
  withClock(
    Clock.fixed(DateTime(2000)),
    () {
      // always prints 2000-01-01 00:00:00.
      print(clock.now());
    },
  );
}

I wrote about this in more detail on my blog.

For widget tests, you need to wrap pumpWidget, pump and expect in the withClock callback.


If you use the clock package for code depending on DateTime.now() you can easily mock it.

Other than creating a custom wrapper around DateTime.now(), I don't think there is a better way than what the clock package provides.


As mentioned here: https://stackoverflow.com/a/63073876/2235274 implement extension on DateTime.

extension CustomizableDateTime on DateTime {
  static DateTime _customTime;
  static DateTime get current {
    return _customTime ?? DateTime.now();
  }

  static set customTime(DateTime customTime) {
    _customTime = customTime;
  }
}

Then just use CustomizableDateTime.current in the production code. You can modify the returned value in tests like that: CustomizableDateTime.customTime = DateTime.parse("1969-07-20 20:18:04");. There is no need to use third party libraries.