Есть ли способ подделать DateTime.now() в тесте Flutter?

Я могу передать время моему виджету, но предполагается, что мой виджет сам создает время, а не получает DateTime от родительского виджета.

3 ответа

Пакет с часами: https://pub.dartlang.org/documentation/clock/latest/clock/clock-library.html позволяет ввести в тест ложные часы.

extension CustomizableDateTime on DateTime {
  static DateTime customTime;
  static DateTime get current {
    if (customTime != null)
      return customTime;
    else
      return DateTime.now();
  }
}

Просто используйте CustomizableDateTime.currentв производственном коде. Вы можете изменить возвращаемое значение в таких тестах:CustomizableDateTime.customTime = DateTime.parse("1969-07-20 20:18:04");. Нет необходимости использовать сторонние библиотеки.

Как сказала Мэри, очень удобный способ - использовать пакет часов , который поддерживается командой Dart.

Нормальное использование:

      import 'package:clock/clock.dart';

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

Отмена текущего времени:

      import 'package:clock/clock.dart';

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

Подробнее об этом я писал в своем блоге .

Просто обратите внимание, что для тестов виджетов вам нужно обернуть, pump а также expect в withClock обратный вызов - только упаковка pumpWidget не работает.

Другие вопросы по тегам