【问题标题】:How to open a drawer in flutter test如何在颤振测试中打开抽屉
【发布时间】:2019-04-17 08:29:17
【问题描述】:

我正在尝试测试一个自定义抽屉,但在测试中发现它很难打开,尝试了以下操作,甚至这个测试也没有通过。错误是:Bad state: no element

void main() {
  testWidgets('my drawer test', (WidgetTester tester) async {
    final displayName = "displayName";
    var drawKey = UniqueKey();
    await tester.pumpWidget(MaterialApp(
        home: Scaffold(
      drawer: Drawer(key: drawKey, child: Text(displayName),),
    )));
    await tester.tap(find.byKey(drawKey));
    expect(find.text(displayName), findsOneWidget);
  });
}

【问题讨论】:

    标签: flutter flutter-test


    【解决方案1】:

    您在Drawer 上调用tap(),但它不在视图中,因为它隐藏在左侧。因此,Finder 找不到任何元素,tap() 不成功。即使Finder 找到了Drawer,点击Drawer 本身也不会打开它。

    一种方法,在我看来,最简单的方法是为Scaffold 提供一个GlobalKey,并在它的当前State 上调用openDrawer()。您也可以点击汉堡图标或从左侧滑动 - 但调用 openDrawer() 更具确定性:

    void main() {
      testWidgets('my drawer test', (WidgetTester tester) async {
        final scaffoldKey = GlobalKey<ScaffoldState>();
        const displayName = "displayName";
    
        await tester.pumpWidget(
          MaterialApp(
            home: Scaffold(
              key: scaffoldKey,
              drawer: const Text(displayName),
            ),
          ),
        );
    
        scaffoldKey.currentState.openDrawer();
        await tester.pump();
    
        expect(find.text(displayName), findsOneWidget);
      });
    }
    

    【讨论】:

      【解决方案2】:

      您可以抓住父小部件的左上角并使用 dragFrom 来模拟打开抽屉。与当前接受的答案相比,这不需要您传递脚手架密钥。

      对原代码稍作修改的示例:

      testWidgets('my drawer test', (WidgetTester tester) async {
        final displayName = "displayName";
        var drawKey = UniqueKey();
        await tester.pumpWidget(MaterialApp(
          home: Scaffold(
            drawer: Drawer(key: drawKey, child: Text(displayName),),
          )));
      
        await tester.dragFrom(tester.getTopLeft(find.byType(MaterialApp)), Offset(300, 0));
        await tester.pumpAndSettle();
      
        expect(find.text(displayName), findsOneWidget);
      });
      

      添加了注意 tester.pumpAndSettle() 以确保经过足够的时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-19
        • 2019-10-30
        • 1970-01-01
        • 1970-01-01
        • 2021-04-10
        • 2020-05-06
        • 2023-02-13
        • 2022-07-20
        相关资源
        最近更新 更多