Export elapseBlocking to test binding, so slow sync work can be simulated such as a slow widget build (#112619)

This commit is contained in:
fzyzcjy 2022-10-06 00:35:58 +08:00 committed by GitHub
parent d554fcb36a
commit c7b40a5270
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 41 additions and 1 deletions

View File

@ -1277,6 +1277,12 @@ class AutomatedTestWidgetsFlutterBinding extends TestWidgetsFlutterBinding {
return Future<void>.value();
}
/// Simulates the synchronous passage of time, resulting from blocking or
/// expensive calls.
void elapseBlocking(Duration duration) {
_currentFakeAsync!.elapseBlocking(duration);
}
@override
Future<void> runTest(
Future<void> Function() testBody,

View File

@ -7,7 +7,7 @@
// https://github.com/flutter/flutter/issues/85160
// Fails with "flutter test --test-randomize-ordering-seed=20210721"
@Tags(<String>['no-shuffle'])
import 'dart:async';
import 'dart:io';
import 'package:flutter/widgets.dart';
@ -56,4 +56,38 @@ void main() {
expect(binding.testTextInput.isRegistered, isFalse);
order += 1;
});
group('elapseBlocking', () {
testWidgets('timer is not called', (WidgetTester tester) async {
bool timerCalled = false;
Timer.run(() => timerCalled = true);
binding.elapseBlocking(const Duration(seconds: 1));
expect(timerCalled, false);
binding.idle();
});
testWidgets('can use to simulate slow build', (WidgetTester tester) async {
final DateTime beforeTime = binding.clock.now();
await tester.pumpWidget(Builder(builder: (_) {
bool timerCalled = false;
Timer.run(() => timerCalled = true);
binding.elapseBlocking(const Duration(seconds: 1));
// if we use `delayed` instead of `elapseBlocking`, such as
// binding.delayed(const Duration(seconds: 1));
// the timer will be called here. Surely, that violates how
// a flutter widget build works
expect(timerCalled, false);
return Container();
}));
expect(binding.clock.now(), beforeTime.add(const Duration(seconds: 1)));
binding.idle();
});
});
}