【问题标题】:Testing text in TextSpan在 TextSpan 中测试文本
【发布时间】:2018-12-16 17:21:30
【问题描述】:

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

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

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

    Finding a TextSpan to tap on with Flutter tests

    【讨论】:

      【解决方案2】:

      可以通过byWidgetPredicate实现

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

      【讨论】:

        【解决方案3】:

        从上面的 sn-ps - 我发现下面的位定制版本对我有帮助..

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

        【讨论】:

          【解决方案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;
          }
          

          【讨论】:

            【解决方案5】:

            除了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】:

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

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

              【讨论】:

              • 如何找到传递 TextSpan 的小部件(正确的是 RichText)?
              • 我自己从评论中回答了我的问题,请参阅我对这个问题的回答,它阐明了 Rémi 的第二点。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2020-05-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多