skills/dart-matcher-best-practices/SKILL.md
Best practices for using `expect` and `package:matcher`. Focuses on readable assertions, proper matcher selection, and avoiding common pitfalls.
npx skillsauth add boazcstrike/opencode dart-matcher-best-practicesInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use this skill when:
expect and package:matcher.hasLength, contains, isEmpty)hasLength(n):
expect(list, hasLength(n)) over expect(list.length, n).isEmpty / isNotEmpty:
expect(list, isEmpty) over expect(list.isEmpty, true).expect(list, isNotEmpty) over expect(list.isNotEmpty, true).contains(item):
unorderedEquals(items):
isA<T> and TypeMatcher<T>)isA<T>():
expect(obj, isA<Type>()).TypeMatcher<Type>()..having().TypeMatcher<T>:
const: const isMyType = TypeMatcher<MyType>();.having() works here too, but the resulting matcher is not const.having)Use .having() on isA<T>() or other TypeMatchers to check properties.
(e) => e.message) instead of generic ones like p0 to improve readability.expect(person, isA<Person>()
.having((p) => p.name, 'name', 'Alice')
.having((p) => p.age, 'age', greaterThan(18)));
This provides detailed failure messages indicating exactly which property failed.
completion(matcher):
await expectLater(...) to ensure the future completes before
the test continues.await expectLater(future, completion(equals(42))).throwsA(matcher):
await expectLater(future, throwsA(isA<StateError>())).expect(() => function(), throwsA(isA<ArgumentError>())) (synchronous
function throwing is fine with expect).expectLaterUse await expectLater(...) when testing async behavior to ensure proper
sequencing.
// GOOD: Waits for future to complete before checking side effects
await expectLater(future, completion(equals(42)));
expect(sideEffectState, equals('done'));
// BAD: Side effect check might run before future completes
expect(future, completion(equals(42)));
expect(sideEffectState, equals('done')); // Race condition!
if statements or for loops for
assertions; let matchers handle it.containsPair for maps instead of checking keys manually).dart-test-fundamentals: Core
concepts for structuring tests, lifecycles, and configuration.dart-checks-migration: Use this
skill if you are migrating tests from package:matcher to modern
package:checks.development
Google Workflow: Announce a Drive file in a Chat space.
development
Google Workflow: Convert a Gmail message into a Google Tasks entry.
development
Google Tasks: Manage task lists and tasks.
development
Google Slides: Read and write presentations.