【问题标题】:Is there a way to fake DateTime.now() in a Flutter test?有没有办法在 Flutter 测试中伪造 DateTime.now() ?
【发布时间】:2019-05-09 11:39:06
【问题描述】:

我可以将时间传递给我的小部件,但我的小部件应该实例化时间本身,而不是从父小部件接收 DateTime。

【问题讨论】:

    标签: testing time flutter


    【解决方案1】:

    时钟包:https://pub.dartlang.org/documentation/clock/latest/clock/clock-library.html 可让您在测试中注入假时钟。

    【讨论】:

    • 你也可以使用mockito之类的东西
    • 使用 mockito 来使用假时间并不那么简单,因为您不能直接存根 DateTime.now()
    【解决方案2】:
    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");。无需使用第三方库。

    【讨论】:

    • 由于它依赖于静态变量,它可以在测试之间添加隐藏的依赖关系。在并行运行时,如果一项测试更改了模拟值,然后它立即被另一项更改,它将导致测试失败。
    【解决方案3】:

    正如 Mary 所说,一个非常简洁的方法是使用由 Dart 团队维护的the clock package

    正常使用:

    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());
        },
      );
    }
    

    我更详细地写过这个on my blog

    请注意,对于小部件测试,您需要在 withClock 回调中包装 pumpWidgetpumpexpect - 仅包装 pumpWidget 不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-07
      • 2021-11-03
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多