在TextSpan中测试文本

19
如果我们有一个作为RichText小部件子元素的 TextSpan,你将如何测试文本内容。
new TextSpan(
  text: 'Hello world!',
  style: new TextStyle(color: Colors.black),
)

在测试中,如果你使用

expect(find.byType(TextSpan), findsOneWidget)同样也无法找到任何类型为TextSpan的小部件。

6个回答

9

这是不可能的。因为 TextSpan 实际上并没有呈现任何内容。它是由另一个对象使用的数据信息,用于实际呈现某些内容。

相反,您可以查找将 TextSpan 传递给的小部件,然后验证它是否正确。


你如何找到传递TextSpan(即RichText)的小部件? - sceee
我自己从评论中回答了我的问题,请查看我的答案,其中澄清了Rémi的第二点。 - sceee

9
除了Rémi的回答外,以下是从RichText中查找文本的方法。 您可以将键设置为RichText,然后可以执行以下操作:
Finder widgetFinder = find.byKey(key);

Finder rtFinder =
   find.descendant(of: widgetFinder, matching: find.byType(RichText));
RichText richText = rtFinder.evaluate().first.widget as RichText;
String richTextText = richText.text.toPlainText();

print('Text from Text widget: $richTextText');
expect(richTextText, 'This is my text',
   reason: 'Text from found text widget do not match');

6

使用byWidgetPredicate可以实现此功能。

expect(
    find.byWidgetPredicate((widget) =>
        widget is RichText &&
        widget.text.toPlainText() ==
            'Hello World!.'),
    findsOneWidget);

3
你可以找到RichText小部件替代。这是find.byWidgetPredicate调用。
expect(find.byWidgetPredicate((widget) => fromRichTextToPlainText(widget) == 'Hello world!'), findsOneWidget);

这里是fromRichTextToPlainText辅助函数。将RichText小部件传递给它,它将返回所有基础TextSpans的纯文本。请注意保留HTML标签。
String fromRichTextToPlainText(final Widget widget) {
  if (widget is RichText) {
    if (widget.text is TextSpan) {
      final buffer = StringBuffer();
      (widget.text as TextSpan).computeToPlainText(buffer);
      return buffer.toString();
    }
  }
  return null;
}

0

从上面的代码片段中,我发现下面这个定制版本对我很有帮助...

String? fromRichTextToPlainText(final Widget widget) {
  if (widget is RichText) {
    return widget.text.toPlainText();
  }
  return null;
}

expect(
          find.byWidgetPredicate(
              (widget) => fromRichTextToPlainText(widget) == 'My Rich Text'),
          findsOneWidget);

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接