Flutter 集成测试:在第二个屏幕上失败

Flutter Integration Test: Fails on second screen

我编写了一个基本的集成测试,但在运行时遇到了问题。 基本上我有一个带有 ÌconButton 的主屏幕。如果单击它会打开一个辅助屏幕。

我的测试是这样的:

  group('end-to-end test', () {
    testWidgets('test settings', (WidgetTester tester) async {
      appmain.main();
      await tester.pumpAndSettle();

      final Finder settingButton = find.byTooltip('Settings');

      // Button is fine
      expect(settingButton, findsOneWidget);
      
      // Button is tapped -- a new screen should open
      await tester.tap(settingButton);

      // "Host" should be on the second screen, HOWEVER this test FAILS
      expect(find.text("Host"), findsWidgets);
    });
  });

所以问题是:如果 Button 被成功点击,为什么测试仍然失败?

事实证明,如果您在集成测试中点击 ÌconButton,仍然会有一个动画——就像您在生产中点击按钮一样。因为动画还在继续,所以测试 expect(find.text("Host"), findsWidgets) 失败了,因为它找不到任何东西。解决方法是等待动画完成,方法是在调用失败的行之前调用await tester.pumpAndSettle()


旁注: 我也尝试使用 press 而不是 tap 但这只会导致新问题因为 press 在移动应用程序的环境中有所不同。您很可能想使用 tap.