Flutter 小部件测试 - 等待未来完成

svp*_*dga 3 flutter

我在 flutter 中有一个小部件测试,它泵送被测小部件,当它打开时,执行后台操作 (staticWrapper.requestPermission()),该操作返回一个 Future,并根据其结果设置一个状态。问题是测试没有等待这个 future 完成,测试代码:

/// 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);
});
Run Code Online (Sandbox Code Playgroud)

受影响的小部件代码:

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);
  });
}
Run Code Online (Sandbox Code Playgroud)

}

Expect() 方法在 setState() 调用之前调用。

有什么帮助吗?

svp*_*dga 5

最后我使用以下方法解决了这个问题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);
});
Run Code Online (Sandbox Code Playgroud)