Как найти свойство `text` виджета во время тестирования во Flutter? - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть фрагмент кода, который создает виджеты «Таблица текста», например:

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, который не равен String toffee.

Я вижу только функцию toString(), например:

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

Как извлечь свойство text, чтобы получить слово toffee?

Сейчас кажется, что все, что я могу сделать, - это проверить, что .toString().contains('toffee'), что не идеально.

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

Вы можете разыграть firstCell до Text.

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

Затем проверить firstCell.data

expect(firstCell.data, 'toffee');
0 голосов
/ 24 июля 2019

Пример Реми не совсем работает - он мог сработать в тот момент, когда он ответил, но в этот момент вызов whereType<Text>() всегда вернет пустое Iterable, потому что evaluate() возвращает Iterable<Element>, а не Iterable<Widget>,Однако вы можете получить виджет Element, вызвав для него .widget, поэтому должен работать следующий код:

Text firstText = find
    .descendant(
      of: find.byType(Table),
      matching: find.byType(Text),
    )
    .evaluate()
    .first
    .widget;

expect(firstText.data, 'toffee');

ОП был очень близок к рабочему коду - было только 2 второстепенныхпроблемы:

  • Используя var вместо Text, тип переменной был Widget
  • Widget сравнивался с String - этоникогда не мог вернуть истину - целью было сравнить свойство Widget с String - в случае Text отображаемое String получается путем вызова .data для Text

Редактировать:

В WidgetTester теперь есть функции для извлечения виджетов: widget(Finder), widgetList(Finder), firstWidget(Finder) и allWidgets,Так что для варианта использования ОП вы должны использовать firstWidget примерно так:

Text firstText = tester.firstWidget(
    find.descendant(
      of: find.byType(Table),
      matching: find.byType(Text),
    ));

expect(firstText.data, 'toffee');
0 голосов
/ 13 сентября 2018

Найти по тексту?

expect(find.text('toffee'), findsOneWidget);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...