Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Flutter widget test - wait Future completion

Tags:

flutter

I have a widget test in flutter that pumps the widget under test, and when it opens, performs a background operation (staticWrapper.requestPermission()) which returns a Future and, based on its result, set a state. The problem is that the test is not waiting this future to complete, test code:

/// When micro permission denied, should show error message.
testWidgets('When micro permission denied, should show error message.',
    (WidgetTester tester) async {
  when(staticWrapper.requestPermission(Permission.RecordAudio))
      .thenAnswer((_) => Future.value(PermissionStatus.denied));
  await tester.pumpWidget(widget);
  final loginText = find.text(callScreen_microPermissionDenied);
  expect(loginText, findsOneWidget);
});

Affected widget code:

void _requestMicroPermission() async {
final result =
    await staticWrapper.requestPermission(Permission.RecordAudio);
debugPrint("Microphone permission status: $result");
if (result == PermissionStatus.authorized) {
  native.init();
} else {
  setState(() {
    _loginText = tnsManager.getText(TranslationsManager.callScreen_microPermissionDenied);
  });
}

}

The expect() method is called before the setState() call.

Any help?

like image 351
svprdga Avatar asked Aug 31 '26 11:08

svprdga


1 Answers

Finally I solved the issue using WidgetTester#pumpAndSettle():

testWidgets('When micro permission denied, should show error message.',
    (WidgetTester tester) async {
  when(staticWrapper.requestPermission(Permission.RecordAudio))
      .thenAnswer((_) => Future.value(PermissionStatus.denied));
  await tester.pumpWidget(widget);
  await tester.pump();
  final loginText = find.text(callScreen_microPermissionDenied);
  expect(loginText, findsOneWidget);
});
like image 139
svprdga Avatar answered Sep 02 '26 12:09

svprdga