如何在Flutter中进行测试时找到Widget的`text`属性?

时间:2018-09-13 00:08:20

标签: testing text dart flutter

我有一段代码可以创建一个文本表小部件,如下所示:

return Table(
  defaultColumnWidth: FixedColumnWidth(120.0),
  children: <TableRow>[
    TableRow(
      children: <Widget>[Text('toffee'), Text('potato')],
    ),
    TableRow(
      children: <Widget>[Text('cheese'), Text('pie')],
    ),
  ],
);

我要测试表格中的第一项确实是“太妃糖”一词。我设置了测试,然后进入这一部分:

var firstCell = find
      .descendant(
        of: find.byType(Table),
        matching: find.byType(Text),
      )
      .evaluate()
      .toList()[0].widget;

  expect(firstCell, 'toffee');

这绝对不起作用,因为firstCell是Widget类型,它不等于字符串toffee

我仅看到toString()函数,如下所示:

'Text("toffee", inherit: true, color: Color(0xff616161), size: 16.0,
 textAlign: left)'

如何提取text属性以获得单词toffee

现在看来,我所能做的就是检查不理想的.toString().contains('toffee')

4 个答案:

答案 0 :(得分:4)

您可以将firstCell投射到Text

var firstCell = find
    .descendant(
      of: find.byType(Table),
      matching: find.byType(Text),
    )
    .evaluate()
    .whereType<Text>()
    .first;

然后测试firstCell.data

expect(firstCell.data, 'toffee');

答案 1 :(得分:1)

按文字查找?

expect(find.text('toffee'), findsOneWidget);

答案 2 :(得分:0)

Rémi的示例不太奏效-在他回答时可能已经奏效,但是此时致电whereType<Text>()将始终返回空的Iterable,因为evaluate()返回{{ 1}},而不是Iterable<Element>。但是,您可以通过在其上调用Iterable<Widget>来获得Element的小部件,因此以下代码应该可以工作:

.widget

OP非常接近具有有效的代码-只有2个小问题:

  • 通过使用Text firstText = find .descendant( of: find.byType(Table), matching: find.byType(Text), ) .evaluate() .first .widget; expect(firstText.data, 'toffee'); 而不是var,变量的类型为Text
  • WidgetWidget进行了比较-这永远不可能返回true-在这种情况下,其目的是将StringWidget的属性进行比较String中的Text的值是通过调用String
  • 上的.data获得的

编辑:

Text现在具有用于检索窗口小部件的实用程序功能:WidgetTesterwidget(Finder)widgetList(Finder)firstWidget(Finder)。因此,对于OP的用例,您将像这样使用allWidgets

firstWidget

答案 3 :(得分:0)

您可以对任何类型的小部件使用缩写形式:

expect(
     (find.byType(InAppWebView).evaluate().single.widget as InAppWebView)
          .initialUrl,
          'https://www.google.com/');