在测试环境下,为了定位 Widgets,我们需要用到 Finder 类。我们可以编写自己的 finderclasses,不过通常使用 flutter_test 包提供的工具来定位 Widgets 更加方便。

下面,我们来看看 flutter_test 包提供的 find 常量并演示如何使用其所提供的 Finders。如需查看完整的 finders 的列表,请参阅 CommonFinders documentation

如果你还不熟悉 Widget 测试和 Finder 类使用方法,请参阅 Introduction to Widget testing

步骤:

  • 查找 Text Widget

  • 使用具体 Key 查找 Widget

  • 查找具体的 Widget 实例

一. 查找 Text Widget

在测试中,我们经常需要查找含有特定文本的 Widget。这正是 find.text 的用途。它会创建一个 Finder 来寻找显示特定文本 String 的 Widget。

  1. testWidgets('finds a Text Widget', (WidgetTester tester) async {
  2. // Build an App with a Text Widget that displays the letter 'H'
  3. await tester.pumpWidget(MaterialApp(
  4. home: Scaffold(
  5. body: Text('H'),
  6. ),
  7. ));
  8. // Find a Widget that displays the letter 'H'
  9. expect(find.text('H'), findsOneWidget);
  10. });

二. 使用具体 Key 查找 Widget

有时,我们可能想要通过已经提供给 Widget 的 Key 来查找 Widget。这样在显示多个相同 Widget实体时会很方便。比如,我们有一个 ListView 列表,它显示了数个含有相同文本的 Text Widgets。

在这种情况下,我们可以为列表中的每一个 Widget 赋予一个 Key。这样我们就可以唯一识别特定的 Widget,在测试环境中更容易查找 Widget。

  1. testWidgets('finds a Widget using a Key', (WidgetTester tester) async {
  2. // Define our test key
  3. final testKey = Key('K');
  4. // Build a MaterialApp with the testKey
  5. await tester.pumpWidget(MaterialApp(key: testKey, home: Container()));
  6. // Find the MaterialApp Widget using the testKey
  7. expect(find.byKey(testKey), findsOneWidget);
  8. });

三. 查找具体的 Widget 实例

最后,我们有时会需要查找 Widget 的具体实例。比如,当创建含有 child 属性的 Widget 并需要确保渲染 child Widget。

  1. testWidgets('finds a specific instance', (WidgetTester tester) async {
  2. final childWidget = Padding(padding: EdgeInsets.zero);
  3. // Provide our childWidget to the Container
  4. await tester.pumpWidget(Container(child: childWidget));
  5. // Search for the childWidget in the tree and verify it exists
  6. expect(find.byWidget(childWidget), findsOneWidget);
  7. });

总结

在测试环境下,flutter_test 包提供的 find 常量给了我们多种查找 Widget 的方法。本篇列举了三种方法,另外还有一些其他用途的方法。

如果上述示例不适用于一些特殊情况,请到 CommonFinders documentation 查看更多用法。

完整示例:

  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_test/flutter_test.dart';
  3. void main() {
  4. testWidgets('finds a Text Widget', (WidgetTester tester) async {
  5. // Build an App with a Text Widget that displays the letter 'H'
  6. await tester.pumpWidget(MaterialApp(
  7. home: Scaffold(
  8. body: Text('H'),
  9. ),
  10. ));
  11. // Find a Widget that displays the letter 'H'
  12. expect(find.text('H'), findsOneWidget);
  13. });
  14. testWidgets('finds a Widget using a Key', (WidgetTester tester) async {
  15. // Define our test key
  16. final testKey = Key('K');
  17. // Build a MaterialApp with the testKey
  18. await tester.pumpWidget(MaterialApp(key: testKey, home: Container()));
  19. // Find the MaterialApp Widget using the testKey
  20. expect(find.byKey(testKey), findsOneWidget);
  21. });
  22. testWidgets('finds a specific instance', (WidgetTester tester) async {
  23. final childWidget = Padding(padding: EdgeInsets.zero);
  24. // Provide our childWidget to the Container
  25. await tester.pumpWidget(Container(child: childWidget));
  26. // Search for the childWidget in the tree and verify it exists
  27. expect(find.byWidget(childWidget), findsOneWidget);
  28. });
  29. }