重要前提
安装AI Skills的关键前提是:必须科学上网,且开启TUN模式,这一点至关重要,直接决定安装能否顺利完成,在此郑重提醒三遍:科学上网,科学上网,科学上网。查看完整安装教程 →
dart-checks-migration by kevmoo/dash_skills
npx skills add https://github.com/kevmoo/dash_skills --skill dart-checks-migration在以下情况下使用此技能:
package:matcher 迁移到 package:checks。grep 识别使用 expect 或 package:matcher 的文件。dev_dependencies 中包含 checks。广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
dart pub add --dev checks。import 'package:checks/checks.dart';。expect 调用都被替换后,才将 import 'package:test/test.dart'; 替换为 import 'package:test/scaffolding.dart';。这确保了增量式进展。传统 expect | 现代 check |
|---|---|
expect(a, equals(b)) | check(a).equals(b) |
expect(a, isTrue) | check(a).isTrue() |
expect(a, isFalse) | check(a).isFalse() |
expect(a, isNull) | check(a).isNull() |
expect(a, isNotNull) | check(a).isNotNull() |
expect(() => fn(), throwsA<T>()) | check(() => fn()).throws<T>() |
expect(list, hasLength(n)) | check(list).length.equals(n) |
expect(a, closeTo(b, delta)) | check(a).isA<num>().isCloseTo(b, delta) |
expect(a, greaterThan(b)) | check(a).isGreaterThan(b) |
expect(a, lessThan(b)) | check(a).isLessThan(b) |
expect(list, isEmpty) | check(list).isEmpty() |
expect(list, isNotEmpty) | check(list).isNotEmpty() |
expect(list, contains(item)) | check(list).contains(item) |
expect(map, equals(otherMap)) | check(map).deepEquals(otherMap) |
expect(list, equals(otherList)) | check(list).deepEquals(otherList) |
expect(future, completes) | await check(future).completes() |
expect(stream, emitsInOrder(...)) | await check(stream).withQueue.inOrder(...) |
检查异步函数:check(() => asyncFunc()).throws<T>() 会导致假阳性,因为闭包返回一个 Future(这是一个值),所以它“正常完成”(作为一个 Future)。正确用法:
await check(asyncFunc()).throws<T>();
在 void 返回上链式调用:许多异步检查方法(如 throws)返回 Future<void>。你不能直接在它们上面进行链式调用。请使用级联或回调。错误示例:
await check(future).throws<Error>().has((e) => e.message, 'message').equals('foo');
正确示例:
await check(future).throws<Error>((it) => it.has((e) => e.message, 'message').equals('foo'));
使用 isA 和 having 进行深度验证:
传统方式:
expect(() => foo(), throwsA(isA<ArgumentError>()
.having((e) => e.message, 'message', contains('MSG'))));
现代方式:
check(() => foo())
.throws<ArgumentError>()
.has((e) => e.message, 'message')
.contains('MSG');
属性提取:
传统方式:
expect(obj.prop, equals(value)); // 当检查多个属性时
现代方式:
check(obj)
..has((e) => e.prop, 'prop').equals(value)
..has((e) => e.other, 'other').equals(otherValue);
单行级联:由于检查通常返回 void,对同一主题进行多个断言时请使用级联。
check(it)..isGreaterThan(10)..isLessThan(20);
test/ 目录下的文件(以及 pubspec.yaml)。package:checks 在类型上比 matcher 更严格。你可能需要在链式调用中添加显式的 as T 类型转换或 isA<T>() 检查。dart-test-fundamentals:关于构建测试、生命周期和配置的核心概念。dart-matcher-best-practices:关于正在被迁移的传统 package:matcher 的最佳实践。每周安装次数
59
代码仓库
GitHub 星标数
120
首次出现
2026年2月16日
安全审计
安装于
antigravity44
github-copilot25
codex24
gemini-cli23
opencode23
cursor23
Use this skill when:
package:matcher to package:checks.grep to identify files using expect or package:matcher.dev_dependencies includes checks.dart pub add --dev checks if missing.import 'package:checks/checks.dart';.import 'package:test/test.dart'; with import 'package:test/scaffolding.dart'; ONLY after all expect calls are replaced. This ensures incremental progress.Legacy expect | Modern check |
|---|---|
expect(a, equals(b)) | check(a).equals(b) |
expect(a, isTrue) | check(a).isTrue() |
expect(a, isFalse) | check(a).isFalse() |
Checking async functions: check(() => asyncFunc()).throws<T>() causes FALSE POSITIVES because the closure returns a Future, which is a value, so it "completes normally" (as a Future). Correct Usage:
await check(asyncFunc()).throws<T>();
Chaining on void returns: Many async check methods (like throws) return Future<void>. You cannot chain directly on them. Use cascades or callbacks. Wrong:
await check(future).throws<Error>().has((e) => e.message, 'message').equals('foo');
Correct:
await check(future).throws<Error>((it) => it.has((e) => e.message, 'message').equals('foo'));
Deep Verification withisA and having:
Legacy:
expect(() => foo(), throwsA(isA<ArgumentError>()
.having((e) => e.message, 'message', contains('MSG'))));
Modern:
check(() => foo())
.throws<ArgumentError>()
.has((e) => e.message, 'message')
.contains('MSG');
Property Extraction:
Legacy:
expect(obj.prop, equals(value)); // When checking multiple props
Modern:
check(obj)
..has((e) => e.prop, 'prop').equals(value)
..has((e) => e.other, 'other').equals(otherValue);
One-line Cascades: Since checks often return void, use cascades for multiple assertions on the same subject.
check(it)..isGreaterThan(10)..isLessThan(20);
test/ (and pubspec.yaml).package:checks is stricter about types than matcher. You may need to add explicit as T casts or isA<T>() checks in the chain.dart-test-fundamentals : Core concepts for structuring tests, lifecycles, and configuration.dart-matcher-best-practices : Best practices for the traditional package:matcher that is being migrated away from.Weekly Installs
59
Repository
GitHub Stars
120
First Seen
Feb 16, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
antigravity44
github-copilot25
codex24
gemini-cli23
opencode23
cursor23
Skills CLI 使用指南:AI Agent 技能包管理器安装与管理教程
52,700 周安装
expect(a, isNull)check(a).isNull() |
expect(a, isNotNull) | check(a).isNotNull() |
expect(() => fn(), throwsA<T>()) | check(() => fn()).throws<T>() |
expect(list, hasLength(n)) | check(list).length.equals(n) |
expect(a, closeTo(b, delta)) | check(a).isA<num>().isCloseTo(b, delta) |
expect(a, greaterThan(b)) | check(a).isGreaterThan(b) |
expect(a, lessThan(b)) | check(a).isLessThan(b) |
expect(list, isEmpty) | check(list).isEmpty() |
expect(list, isNotEmpty) | check(list).isNotEmpty() |
expect(list, contains(item)) | check(list).contains(item) |
expect(map, equals(otherMap)) | check(map).deepEquals(otherMap) |
expect(list, equals(otherList)) | check(list).deepEquals(otherList) |
expect(future, completes) | await check(future).completes() |
expect(stream, emitsInOrder(...)) | await check(stream).withQueue.inOrder(...) |