在 TextSpan 中测试文本

问题描述 投票:0回答:6

如果我们有一个

TextSpan
,它是
RichText
小部件的子级,您将如何测试文本内容。

new TextSpan(
  text: 'Hello world!',
  style: new TextStyle(color: Colors.black),
)

在您的测试中,使用

Text
小部件,您可以使用
expect(find.text('Hello world!'), findsOneWidget)
,但如果您有
TextSpan
,则这不起作用。

expect(find.byType(TextSpan), findsOneWidget)
也没有找到任何类型为
TextSpan
的小部件。

dart flutter
6个回答
10
投票

那是不可能的。因为

TextSpan
实际上并没有渲染任何东西。 它是另一个对象用来实际渲染某些内容的数据信息。

您可以做的是找到您将

TextSpan
传递到的小部件。然后验证它是否正确


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');

9
投票

可以通过使用

byWidgetPredicate

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

4
投票

您可以找到 RichText 小部件。这是 find.byWidgetPredicate 调用。

expect(find.byWidgetPredicate((widget) => fromRichTextToPlainText(widget) == 'Hello world!'), findsOneWidget);

这是 fromRichTextToPlainText 辅助函数。将 RichText 小部件传递给它,它将返回所有底层 TextSpan 的纯文本。

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
投票

如果有人不仅需要找到该小部件,还需要点击它:

通过 Flutter 测试找到要点击的 TextSpan

© www.soinside.com 2019 - 2024. All rights reserved.