有没有办法在 Flutter 测试中伪造 DateTime.now() ?
Posted
技术标签:
【中文标题】有没有办法在 Flutter 测试中伪造 DateTime.now() ?【英文标题】:Is there a way to fake DateTime.now() in a Flutter test? 【发布时间】:2019-05-09 11:39:06 【问题描述】:我可以将时间传递给我的小部件,但我的小部件应该实例化时间本身,而不是从父小部件接收 DateTime。
【问题讨论】:
【参考方案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
回调中包装 pumpWidget
、pump
和 expect
- 仅包装 pumpWidget
不起作用。
【讨论】:
以上是关于有没有办法在 Flutter 测试中伪造 DateTime.now() ?的主要内容,如果未能解决你的问题,请参考以下文章