如何在Flutter中存根目标平台

时间:2019-08-23 14:22:03

标签: flutter dart flutter-test

假设我有一个小部件,该小部件的行为因平台而异:

  • 如果平台是Android,则显示library(tibble) library(tidyr) library(purrr) library(dplyr) enframe(Path, name = "number", value = "url") %>% unnest %>% mutate(Plugin = case_when(substr(url, 1, 2) == "S1" ~ "class org.esa.s1tbx.io.sentinel1.Sentinel1ProductReaderPlugIn", TRUE ~ "class org.esa.s2tbx.dataio.s2.ortho.plugins.Sentinel2L1CProduct_Multi_UTM42N_ReaderPlugIn"))
  • 如果平台是iOS,则显示RaisedButton

示例:

CupertinoButton

在我的widget tests中,我希望能够测试这两种情况,但是由于@override Widget build(BuildContext context) { if (Platform.isAndroid) return buildRaisedButton(); else if (Platform.isIOS) return buildCupertinoButton(); else throw UnsupportedError('Only Android and iOS are supported.'); } 的吸气剂是静态的,因此无法对它们进行存根。

关于如何实现此目标的任何想法?

1 个答案:

答案 0 :(得分:2)

确认目标平台

应该从Platform而不是Theme确认目标平台:

Platform

吸气剂@override Widget build(BuildContext context) { var platform = Theme.of(context).platform; if (platform == TargetPlatform.android) return buildRaisedButton(); else if (platform == TargetPlatform.iOS) return buildCupertinoButton(); else throw UnsupportedError('Only Android and iOS are supported.'); } 应该能够涵盖您无权使用defaultTargetPlatform的情况。

存根目标平台

要存根目标平台,必须设置BuildContext。默认情况下,Android是小部件测试的目标平台。

示例:

debugDefaultTargetPlatformOverride

注意最后一行:testWidgets( '`CupertinoButton` is shown in iOS.', (tester) async { debugDefaultTargetPlatformOverride = TargetPlatform.iOS; await tester.pumpWidget(MyWidget()); expect(find.byType(RaisedButton), findsNothing); expect(find.byType(CupertinoButton), findsOneWidget); debugDefaultTargetPlatformOverride = null; }, );

这是必要的,因为在函数debugDefaultTargetPlatformOverride = null内发生的绑定过程中,方法testWidgets()根据操作系统确定BindingBase.initServiceExtensions()的值。如果操作系统不是移动系统(Android,iOS或紫红色),则debugDefaultTargetPlatformOverride被赋予属性。

在测试结束时,null调用函数testWidgets()来检查debugAssertAllFoundationVarsUnset()是否为debugDefaultTargetPlatformOverride,以确保您不会忘记将其重置为默认值。之所以必须这样做,是因为null是一个在测试之间持久存在的顶级变量。

重要提示:您可能会想将debugDefaultTargetPlatformOverride移至debugDefaultTargetPlatformOverride = null,但由于在tearDown()之前调用了debugAssertAllFoundationVarsUnset(),因此无法正常工作