用途:把现有 Dart 测试从 package:matcher 迁移到 package:checks,适用于用户要求使用“modern checks”或需要现代化断言的场景。
主要能力:先用 grep 定位使用 expect 或 package:matcher 的文件,审查自定义 matcher(可能需手动迁移);确认 dev_dependencies 含 checks,缺失时运行 dart pub add --dev checks;按常见模式替换断言,例如 expect(a, equals(b)) 改为 check(a).equals(b),isTrue/isFalse/isNull/isNotNull 改为对应方法,throwsA<T>() 改为 throws<T>(),hasLength(n) 改为 length.equals(n),closeTo 改为 isA<num>().isCloseTo,greaterThan/lessThan、isEmpty/isNotEmpty、contains、deepEquals、completes、emitsInOrder 等均有对应写法。
使用方式:添加 import 'package:checks/checks.dart';,应用替换模式;仅在所有 expect 替换完成后,才把 import 'package:test/test.dart'; 换成 import 'package:test/scaffolding.dart';,以保证增量推进。最后确保代码分析干净、测试通过。
异步要点:check(() => asyncFunc()).throws<T>() 会产生误报,应写 await check(asyncFunc()).throws<T>();;throws 等返回 Future<void>,不能直接链式调用,需用级联或回调,如 await check(future).throws<Error>((it) => it.has((e) => e.message, 'message').equals('foo'));。
限制:只修改 test/ 目录与 pubspec.yaml;迁移后若有测试失败且无法立即修复,应回退该处改动;package:checks 类型更严格,可能需要显式 as T 转换或 isA<T>() 检查。相关技能包括 dart-test-fundamentals 与 dart-matcher-best-practices。