Flutter小部件测试 - 等待Future完成

3

我在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);
});

受影响的小部件代码:

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);
  });
}

在调用setState()之前,需要调用expect()方法。

需要帮助吗?


1
当你执行 setState 时,你必须再次调用 tester.pump - Rémi Rousselet
@RémiRousselet 没有办法做到这一点,因为setState是在测试类中完成的。 - svprdga
1
你所做的正是我建议的。你不需要使用 andSettle。一个简单的 pump 就足够了。 - Rémi Rousselet
抱歉@RémiRousselet,我没有正确理解你的意思,你是对的,pump就足够了,我会更正我的答案。谢谢。 - svprdga
1个回答

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);
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接