在 TextSpan 中测试文本



如果我们有一个TextSpanRichText小部件的子项,您将如何测试文本内容。

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.

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

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

除了雷米的回答之外,这是从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');

可以使用byWidgetPredicate

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

您可以改为找到富文本小部件。这是find.byWidgetPredicate调用。

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

下面是 fromRichTextToPlainText 帮助程序函数。将富文本小部件传递给它,它将返回所有底层 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;
}

从上面的片段 - 我发现下面的定制版本对我很有帮助。

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

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

查找要点击 Flutter 测试的 TextSpan(英语:TextSpan(

最新更新