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