我为我的小部件创建了以下Flutter测试
testWidgets("", (WidgetTester tester) async {
await tester.pumpWidget(
ChangeNotifierProvider<SettingsViewProvider>(
create: (context) => SettingsViewProvider(),
child: MaterialApp(
localizationsDelegates: [S.delegate],
home: SettingsScreen(),
),
),
);
final textFormFieldFinder = find.byElementType(TextFormField);
await tester.pump();
expect(textFormFieldFinder, findsNWidgets(3));
});
该小部件是一个有状态的小部件,它使用ChangeNotifierProvider,并且使用者将三个“ TextFormFields”的列表包围起来。
Consumer<State>(
builder: (context, value, child)=> Column(
children: [TextFormField(...), TextFormField(...), TextFormField(...)];
)
)
预期:窗口小部件树中恰好有3个匹配的节点
实际:_ElementTypeFinder:
其中:表示未找到任何东西,但预期会出现
不幸的是,我收到在小部件树中找不到任何小部件。
答案 0 :(得分:3)
似乎可以使用以下方法解决:
final textFormFieldFinder = find.byType(TextFormField);
代替:
final textFormFieldFinder = find.byElementType(TextFormField);
答案 1 :(得分:1)
如前所述,您应该使用find.byType
来锁定小部件,而不要使用find.byElementType
来处理Elements。
Flutter具有3个构建UI块:
Widgets
(不可变)-> Elements
(可变)-> Render Objects
-它们不是彼此继承的,它们是具有不同用途的不同类型的对象。
TextFormField
是Widget
,正在传递给find.byElementType
的祖先,Element