This package provides a FakeAsync
class, which makes it easy to
deterministically test code that uses asynchronous features like Future
s,
Stream
s, Timer
s, and microtasks. It creates an environment in which the user
can explicitly control Dart's notion of the "current time". When the time is
advanced, FakeAsync
fires all asynchronous events that are scheduled for that
time period without actually needing the test to wait for real time to elapse.
For example:
import 'dart:async';
import 'package:fake_async/fake_async.dart';
import 'package:test/test.dart';
void main() {
test("Future.timeout() throws an error once the timeout is up", () {
// Any code run within [fakeAsync] is run within the context of the
// [FakeAsync] object passed to the callback.
fakeAsync((async) {
// All asynchronous features that rely on timing are automatically
// controlled by [fakeAsync].
expect(Completer().future.timeout(Duration(seconds: 5)),
throwsA(isA<TimeoutException>()));
// This will cause the timeout above to fire immediately, without waiting
// 5 seconds of real time.
async.elapse(Duration(seconds: 5));
});
});
}
FakeAsync
can't control the time reported by DateTime.now()
or by
the Stopwatch
class, since they're not part of dart:async
. However, if
you create them using the clock
package's clock.now()
or
clock.stopwatch()
functions, FakeAsync
will automatically override
them to use the same notion of time as dart:async
classes.