install
source · Clone the upstream repo
git clone https://github.com/kevmoo/dash_skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/kevmoo/dash_skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/.agent/skills/dart-test-fundamentals" ~/.claude/skills/kevmoo-dash-skills-dart-test-fundamentals && rm -rf "$T"
manifest:
.agent/skills/dart-test-fundamentals/SKILL.mdsource content
Dart Test Fundamentals
When to use this skill
Use this skill when:
- Writing new test files.
- Structuring test suites with
.group - Configuring test execution via
.dart_test.yaml - Understanding test lifecycle methods.
Core Concepts
1. Test Structure (test
and group
)
testgroup-
: The fundamental unit of testing.testtest('description', () { // assertions }); -
: Used to organize tests into logical blocks.group- Groups can be nested.
- Descriptions are concatenated (e.g., "Group Description Test Description").
- Helps scope
andsetUp
calls.tearDown - Naming: Use
for groups that correspond to a class name (e.g.,PascalCase
).group('MyClient', ...) - Avoid Single Groups: Do not wrap all tests in a file with a single
call if it's the only one.group- NOTE: DO NOT remove groups when doing a cleanup on existing code you didn't create unless explicitly asked to. This can cause a LOT of churn in the DIFF that most engineers won't want!
-
Naming Tests
:test('test name here',- Avoid redundant "test" prefixes. Use
instead.group - Include the expected behavior or outcome in the description (e.g.,
or'throws StateError'
).'adds API key to URL' - Descriptions should read well when concatenated with their group name.
- Avoid redundant "test" prefixes. Use
-
Named Parameters Placement:
- For
andtest
calls, place named parameters (e.g.,group
,testOn
,timeout
) immediately after the description string, before the callback closure. This improves readability by keeping the test logic last.skiptest('description', testOn: 'vm', () { // assertions });
- For
2. Lifecycle Methods (setUp
, tearDown
)
setUptearDown
: Runs before everysetUp
in the currenttest
(and nested groups).group
: Runs after everytearDown
in the currenttest
.group
: Runs once before any test in the group.setUpAll
: Runs once after all tests in the group.tearDownAll
Best Practice:
- Use
for resetting state to ensure test isolation.setUp - Avoid sharing mutable state between tests without resetting it.
3. Cleaning Up Resources
- To clean up resources created WITHIN the
body, consider usingtest
instead of aaddTearDown
block.try-finally
Avoid:
test('can create and delete a file', () { final file = File('temp.txt'); try { file.writeAsStringSync('hello'); expect(file.readAsStringSync(), 'hello'); } finally { if (file.existsSync()) file.deleteSync(); } });
Prefer:
test('can create and delete a file', () { final file = File('temp.txt'); // Register teardown immediately after resource creation intent addTearDown(() { if (file.existsSync()) file.deleteSync(); }); file.writeAsStringSync('hello'); expect(file.readAsStringSync(), 'hello'); });
4. Configuration (dart_test.yaml
)
dart_test.yamlThe
dart_test.yaml file configures the test runner. Common configurations
include:
Platforms
Define where tests run (vm, chrome, node).
platforms: - vm - chrome
Tags
Categorize tests to run specific subsets.
tags: integration: timeout: 2x
Usage in code:
@Tags(['integration']) import 'package:test/test.dart';
Running tags:
dart test --tags integration
Timeouts
Set default timeouts for tests.
timeouts: 2x # Double the default timeout
5. File Naming
- Test files must end in
to be picked up by the test runner._test.dart - Place tests in the
directory.test/
Common commands
: Run all tests.dart test
: Run a specific file.dart test test/path/to/file_test.dart
: Run tests matching a description.dart test --name "substring"
Related Skills
dart-test-fundamentals is the core skill for structuring and configuring
tests. For writing assertions within those tests, refer to:
- dart-matcher-best-practices:
Use this if the project sticks with the traditional
(package:matcher
calls).expect - dart-checks-migration: Use this
if the project is migrating to the modern
(package:checks
calls).check