测试文本小部件中的子字符串

时间:2018-11-26 00:08:56

标签: dart flutter

通常情况下,您可以使用find.text()来查找整个字符串,

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

如何在Text小部件中查找子字符串?假设有'text to find'的文本,我们只是想检查'to'是否是Text小部件的一部分。

2 个答案:

答案 0 :(得分:2)

通过使用find.byWidgetPredicate,您可以指定自己的验证谓词,从而检查所需的所有内容,例如文本的子字符串。

例如:

expect(find.byWidgetPredicate((widget) {
  if (widget is Text) {
    final Text textWidget = widget;
    if (textWidget.data != null)
      return textWidget.data.contains('mySubstr');
    return textWidget.textSpan.toPlainText().contains('mySubstr');
  } 
  return false;
}), findsOneWidget);

答案 1 :(得分:0)

现在,使用dart扩展方法,我们可以编写更具可读性的测试。

首先,向CommonFinders类添加一个新方法:

extension CustomFinders on CommonFinders {
  Finder textMatch(Pattern pattern, {bool skipOffstage = true}) =>
      _PatternMatchFinder(pattern, skipOffstage: skipOffstage);
}

class _PatternMatchFinder extends MatchFinder {
  _PatternMatchFinder(this.pattern, {bool skipOffstage = true}) : super(skipOffstage: skipOffstage);

  final Pattern pattern;

  @override
  String get description => 'textMatch "$pattern"';

  @override
  bool matches(Element candidate) {
    final Widget widget = candidate.widget;
    if (widget is Text) {
      if (widget.data != null) return pattern.allMatches(widget.data).isNotEmpty;
      return pattern.allMatches(widget.textSpan.toPlainText()).isNotEmpty;
    } else if (widget is EditableText) {
      return pattern.allMatches(widget.controller.text).isNotEmpty;
    }
    return false;
  }
}

现在我们的测试如下:

expect(find.textMatch('Back'), findsOneWidget);
expect(find.textMatch(RegExp(r'\s*Back.*')), findsOneWidget);