代码之家  ›  专栏  ›  技术社区  ›  Coldstar

颤振:在单元测试中获取PopupMenuButton的PopupMenuItem文本

  •  2
  • Coldstar  · 技术社区  · 8 年前

    我有一个PaginatedDataTable,它有一个带有PopupMenuButton的数据单元。WidgetTester可以发现每个数据单元都没有问题,但我似乎无法引用PopupMenuButton的项来尝试选择一个。

    如何在单元测试中获取PopupMenuButton的PopupMenuItem文本 ?我正在使用 await tester.pump(); 是否正确显示菜单?

    我现在是这样做的:

    ...
    expect(find.byIcon(Icons.more_horiz).first, findsOneWidget); // works!
    
    await tester.tap(find.byIcon(Icons.more_horiz).first);
    await tester.pump();
    
    var byType = find.text('Quote');
    expect(byType, findsOneWidget); // fails!
    

    在以下情况下失败

    zero widgets with text "Quote" (ignoring offstage widgets)...
    

    这是数据单元标记

    ...
    new DataCell(...),
    new DataCell(new PopupMenuButton<quickActions>(
          icon: new Icon(Icons.more_horiz),
          onSelected: (quickActions action) {
            _selectContextAction(action);
          },
          itemBuilder: (BuildContext context) => <PopupMenuEntry<quickActions>>[
                new PopupMenuItem<quickActions>(
                  value: quickActions.edit,
                  child: new Text('Edit'),
                ),
                new PopupMenuItem<quickActions>(
                  value: quickActions.remove,
                  child: new Text('Remove'),
                ),
                new PopupMenuItem<quickActions>(
                  value: quickActions.reschedule,
                  child: new Text('Re-schedule'),
                ),
                new PopupMenuItem<quickActions>(
                  value: quickActions.bid,
                  child: new Text('Quote'),
                ),
              ],
        ))
    
    1 回复  |  直到 8 年前
        1
  •  3
  •   Hey24sheep    8 年前

    我知道这是一个老问题,但我发现自己也遇到了同样的问题,我已经解决了。

    对于那些有同样问题的人,我将发布我的答案。我的考试和你的有点不同。

    什么是 Pump

    在持续时间后触发帧。

    这使得框架的行为就像应用程序发生了故障(错过了 帧),然后接收到v同步信号 为应用程序涂漆。

    什么是 PumpAndSettle

    在给定的持续时间内重复调用泵 直到不再计划任何帧。这将调用pump at 至少一次,即使在函数 调用,以刷新可能自己安排的任何挂起的微任务 一个框架。

    //My Code
    //await tester.tap(find.byIcon(Icons.text_fields));
    //await tester.pumpAndSettle();
    
    //await tester.tap(find.text(expectedFontSize + ' px'));
    //expect(fontSize, expectedFontSize);
    
    //call again if you want to do testing again or something again 
    //await tester.pumpAndSettle();
    
     var mainButton = find.byIcon(Icons.more_horiz); 
     expect(mainButton, findsOneWidget);
    
     await tester.tap(mainButton);
     await tester.pumpAndSettle();
    
     var childButton = find.text('Quote');
     expect(childButton , findsOneWidget); //
    

    对我来说,代码只有在调用 泵和沉淀 方法