在TextSpan中测试文本

时间:2018-07-09 05:08:13

标签: dart flutter

如果我们有一个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的小部件。

4 个答案:

答案 0 :(得分:2)

那是不可能的。由于TextSpan实际上不呈现任何内容。 它是另一个对象用来实际渲染某些东西的数据信息。

您可以做的是找到将TextSpan传递到的小部件。然后确认它是正确的

答案 1 :(得分:1)

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

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

这是fromRichTextToPlainText辅助函数。将其传递给RichText小部件,它将为所有基础TextSpans返回纯文本。

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;
}

答案 2 :(得分:0)

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

答案 3 :(得分: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);