在提供程序的使用者小部件内部无法在测试中找到小部件

时间:2020-04-26 11:56:29

标签: flutter flutter-test flutter-provider

我为我的小部件创建了以下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:

其中:表示未找到任何东西,但预期会出现

不幸的是,我收到在小部件树中找不到任何小部件。

2 个答案:

答案 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 -它们不是彼此继承的,它们是具有不同用途的不同类型的对象。

TextFormFieldWidget,正在传递给find.byElementType的祖先,Element