Flutter 小部件测试点击 - 不会在指定的小部件上进行测试

时间:2021-07-13 16:23:58

标签: flutter flutter-test

在输出以下警告后,我的小部件测试失败:

<块引用>

flutter:警告:使用 finder 调用 tap()“恰好是一个带有文本“Tab 2”的小部件(忽略后台小部件):Text(“Tab 2”,softWrap:除换行符外没有换行,溢出:淡入淡出,依赖项:[MediaQuery, DefaultTextStyle])" 派生了一个偏移量 (Offset(600.0, 23.0)),它不会在指定的小部件上进行测试。 flutter:也许小部件实际上不在屏幕上,或者其他小部件遮挡了它,或者小部件无法接收指针事件。

tap 从未执行,因此测试的下一部分失败。我在测试中进行了一些延迟,看起来测试正在尝试点击正确的小部件 - 它没有离屏,没有被遮挡,并且过去能够接收指针事件 - 不确定为什么它当前失败。

这是一个最小的可重现示例:

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: DefaultTabController(
        length: 2,
        child: Scaffold(
          appBar: TabBar(
            labelColor: Color(0xff8391e4),
            tabs: [
              Tab(text: 'Tab 1'),
              Tab(text: 'Tab 2'),
            ],
          ),
          body: TabBarView(
            children: <Widget>[
              Text('Tab 1 Text'),
              Text('Tab 2 Text'),
            ],
          ),
        ),
      ),
    );
  }
}

void main() {
  TestWidgetsFlutterBinding.ensureInitialized();

  testWidgets('My Test', (WidgetTester tester) async {
    await tester.pumpWidget(MyApp());
    await tester.pumpAndSettle();

    // Warning thrown on this tap - tap never executed
    await tester.tap(find.text('Tab 2'));
    await tester.pumpAndSettle();

    // Test fails here
    expect(find.text('Tab 2 Text'), findsOneWidget);
  });
}

1 个答案:

答案 0 :(得分:0)

尝试在 ensureVisible() 之前设置 tap()

// Warning thrown on this tap - tap never executed
await tester.ensureVisible(find.text('Tab 2'));
await tester.tap(find.text('Tab 2'));
await tester.pumpAndSettle();