假设我有一个小部件,该小部件的行为因平台而异:
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"))
。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.');
}
的吸气剂是静态的,因此无法对它们进行存根。
关于如何实现此目标的任何想法?
答案 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()
,因此无法正常工作