Testing async Code and Streams
Await futures and verify event sequences.
Testing async Code and Streams is a free Dart Academy lesson on CoddyKit — lesson 3 of 4. You can read the complete lesson below for free — then practise it hands-on in the browser with a built-in code editor and a 24/7 AI tutor. It is part of the Dart Academy learning path, one of 4 lessons in the course, and your progress syncs across the web and the CoddyKit app.
Async Needs Care
Lots of real code returns a Future. If a test forgets to wait, it may pass before the work even finishes. ⏳
Return or await
The runner waits when your test body is async and you await the work, or when you return the Future directly.
test('loads user', () async {
final u = await fetchUser();
expect(u.name, 'Ada');
});expectLater for Futures
Use expectLater when the matched value is itself a Future, like checking a Future completes with a given result.
await expectLater(fetchValue(), completion(42));The completion Matcher
The completion matcher passes when a Future finishes successfully and its value matches the inner matcher.
expectLater(load(), completion(isNotEmpty));Expecting Async Errors
To assert a Future fails, pair expectLater with throwsA so the test verifies the right error is thrown.
await expectLater(
risky(), throwsA(isA<StateError>()));Streams Emit Many Values
A Stream sends a sequence of events over time. Testing it means checking that whole sequence, in order.
The emits Matcher
Use emits to assert the next value a stream produces, and emitsInOrder for an expected sequence.
await expectLater(
counter, emitsInOrder([1, 2, 3]));Signal the End
The emitsDone matcher checks that a stream closes when expected, catching streams that never finish.
expectLater(ticks, emitsThrough(emitsDone));Stream Errors Too
Combine matchers to expect an error in a stream with emitsError, verifying failures arrive as events.
emitsInOrder([1, emitsError(isException)]);Beware Fake Passes
A common bug: forgetting await means the test ends early and passes silently. Always await or return async work.
Timeouts Save You
If async code hangs, the runner stops it. You can tune the wait with a timeout on a slow test.
test('slow', () async { /* ... */ },
timeout: Timeout(Duration(seconds: 5)));Quick Check
How do you assert a stream emits 1, 2, 3 in order?
Recap
You awaited Futures, used expectLater with completion and throwsA, and checked streams with emits matchers. Async, tested with confidence. 🌊
Frequently asked questions
Is the “Testing async Code and Streams” lesson free?
Yes — the full text of “Testing async Code and Streams” is free to read here on the web, and the Dart Academy course includes 4 lessons in total. To practise it interactively (a built-in code editor and a 24/7 AI tutor) and unlock the rest of the Dart Academy course, upgrade to CoddyKit PRO.
What will I learn in “Testing async Code and Streams”?
Await futures and verify event sequences. You practise Dart Academy with hands-on code you run directly in the browser, and a 24/7 AI tutor answers your questions as you work through the lesson.
Do I need any experience to start Dart Academy?
No prior experience is required. Dart Academy on CoddyKit is structured for beginners through advanced learners; this is — lesson 3 of 4, so you can start here or from the beginning and move at your own pace.
How long does the “Testing async Code and Streams” lesson take?
Most CoddyKit lessons take about 5–10 minutes. Each one is bite-sized and interactive, so you make steady progress and pick up exactly where you left off across the web and the app.
Can I write and run code in this Dart Academy lesson?
Yes. Every Dart Academy lesson includes a built-in code editor, so you write and run real code right in your browser and get instant AI feedback — no local setup required.
All lessons in this course
- Your First test and expect
- group, setUp, and tearDown
- Testing async Code and Streams
- Mocks, Fakes, and Coverage