TestWidgetsFlutterBinding.clock 变更
概述
#TestWidgetsFlutterBinding.clock 现在来自 package:clock 而不是 package:quiver。
背景
#flutter_test 包正在移除对重量级的 quiver 包的依赖,转而依赖两个更具针对性且更轻量级的包:clock 和 fake_async。
这可能会影响用户代码,例如:用户从 TestWidgetsFlutterBinding 获取 clock 并将其传递给一个期望来自 package:quiver 的 Clock 的 API,类似如下代码:
testWidgets('some test', (WidgetTester tester) {
someApiThatWantsAQuiverClock(tester.binding.clock);
});迁移指南
#在此更改后,您可能会看到的错误类似如下:
Error: The argument type 'Clock/*1*/' can't be assigned to the parameter type 'Clock/*2*/'.
- 'Clock/*1*/' is from 'package:clock/src/clock.dart' ('<pub-cache>/clock/lib/src/clock.dart').
- 'Clock/*2*/' is from 'package:quiver/time.dart' ('<pub-cache>/quiver/lib/time.dart').选项 #1:从 package:clock 创建一个 package:quiver Clock
#最简单的迁移方法是,从 package:clock 的 clock 创建一个 package:quiver clock,这可以通过将 .now 函数的 tearoff 传递给 Clock 构造函数来完成。
迁移前的代码
testWidgets('some test', (WidgetTester tester) {
someApiThatWantsAQuiverClock(tester.binding.clock);
});迁移后的代码
testWidgets('some test', (WidgetTester tester) {
someApiThatWantsAQuiverClock(Clock(tester.binding.clock.now));
});选项 #2:更改 API 以接受一个 package:clock Clock
#如果您拥有您正在调用的 API,您可能希望将其更改为接受来自 package:clock 的 Clock。这是一个判断性决定,取决于有多少地方使用非从 TestWidgetsFlutterBinding 检索到的 clock 来调用此 API。
如果您选择此路线,您调用 tester.binding.clock 的调用点将无需修改,但其他调用点则需要。
选项 #3:更改 API 以接受一个 DateTime 函数()
#如果您仅将 Clock 用于其 now 函数,并且您控制该 API,那么您也可以将其更改为直接接受该函数而不是 Clock。通过传递任一类型 clock 的 now 方法的 tearoff,可以轻松地用这两种类型的 Clock 调用它。
迁移前调用代码
testWidgets('some test', (WidgetTester tester) {
someApiThatWantsAQuiverClock(tester.binding.clock);
});迁移后调用代码
testWidgets('some test', (WidgetTester tester) {
modifiedApiThatTakesANowFunction(tester.binding.clock.now);
});时间线
#发布版本:1.18.0
稳定版本中:1.20
参考资料
#API 文档
相关 PR
- PR 54125: 移除 flutter_test quiver 依赖,改用 fake_async 和 clock