如何在Flutter(Dart)中用withClock模拟DateTime.now()?
如何在Flutter单元测试中模拟DateTime.now()的值?
你的问题核心是被测代码直接调用了原生的DateTime.now(),而没有使用clock包提供的clock.now()——clock包的withClock只能拦截通过clock.now()获取的时间,对原生DateTime.now()无效。
解决步骤:
修改被测代码,替换
DateTime.now()为clock.now()
在app/utils/time_manager.dart中导入clock包,并用clock.now()替代原来的DateTime.now():import 'package:clock/clock.dart'; class TimeManager { static String formatDateToRelative(String date) { final now = clock.now(); // 替换为clock包的now方法 // 你的日期格式化逻辑 return 'doesntmatter for now'; } }测试代码无需改动
你原有的测试代码逻辑是正确的,withClock(Clock.fixed(fakeClock), ...)会正确替换clock.now()返回的时间,此时formatDateToRelative中的now变量就会变成你预设的2018-02-07 13:55:59,而非系统当前时间。
原理说明:
clock包的核心是提供了一个可替换的全局时钟实例,clock.now()会返回当前设置的时钟时间;withClock方法会临时替换这个全局时钟,在其回调函数范围内,所有clock.now()的调用都会使用你传入的固定时钟(或其他自定义时钟)。而原生DateTime.now()直接读取系统时间,不受clock包的控制。
内容的提问来源于stack exchange,提问作者Kristi Jorgji
相关产品推荐
相关产品推荐

