【问题标题】:Flutter widget tests with platform branching带有平台分支的 Flutter 小部件测试
【发布时间】:2019-08-09 13:24:18
【问题描述】:

在我的小部件代码中,我需要在 Android/iOS 上进行分支以显示特定于每个平台的小部件,并调用特定于平台的 API(例如,Android 小部件将调用仅在 Android 上可用的 API)。

  if (Platform.isAndroid) {
    return WidgetAndroid(...);
  } else if (Platform.isIOS) {
    return WidgetIOS(...);
  }

如何使用 Flutter 小部件测试来测试是否显示了正确的小部件?

我知道我可以检查小部件是否存在,但是如何在特定平台上运行测试。

expect(find.byType(WidgetIOS), findsOneWidget);

【问题讨论】:

    标签: flutter


    【解决方案1】:

    Platform.isAndroidPlatform.isIOS 在运行 testWidgets 时都返回 false

    我们可以在测试中应用一些建议:

    • 将平台作为变量传递给您的顶级小部件,这样您就可以手动提供该值。
    • 将要测试的案例设置为不带ifelse,以便在测试期间运行。
    • 改用 Platform from https://pub.dev/packages/platform 允许模拟,这可能是最好的长期解决方案。

    【讨论】:

      【解决方案2】:

      就像 Miguel 提到的,你不能直接模拟它。

      如果您使用provider 框架,您可以在测试中使用依赖注入来实现这一点,而无需在小部件中暴露额外的参数。

      创建一个用于注入的类:

      class PlatformInfo {
        final bool isIos;
        final bool isAndroid;
      
        PlatformInfo({@required this.isAndroid,@required  this.isIos});
      }
      
      

      在您的顶级 MultiProvider 小部件中,设置您的提供程序绑定:

      Provider<PlatformInfo>.value(
          value: PlatformInfo(isAndroid: Platform.isAndroid, isIos: Platform.isIOS),
      ),
      

      在您的小部件中使用它:

      Provider.of<PlatformInfo>(context).isIos
      

      【讨论】:

        猜你喜欢
        • 2019-02-25
        • 2021-05-09
        • 2020-03-21
        • 1970-01-01
        • 2019-06-13
        • 2022-01-16
        • 2019-05-23
        • 2019-10-31
        • 1970-01-01
        相关资源
        最近更新 更多