Flutter:在单元测试

时间:2018-03-28 19:10:24

标签: dart flutter flutter-test

我有一个PaginatedDataTable,它有一个带有PopupMenuButton的DataCell。 WidgetTester可以找到每个DataCell没问题,但我似乎无法引用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)...

这是DataCell标记

...
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 个答案:

答案 0 :(得分:1)

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

对于那些有同样问题的人,我要发布答案。我的测验与您的测验有些不同。

  

什么是Pump

     

在持续时间后触发一帧。

     

这使框架的行为就像应用程序变弱了一样(未选中   帧)持续一段时间,然后接收到垂直同步信号   绘制应用程序。

     

什么是PumpAndSettle

     

重复给定持续时间的泵   直到不再计划任何帧。这将在   至少一次,即使该功能为   调用,以刷新可能自己安排的所有未完成的微任务   一个框架。

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

对我来说,代码仅在调用PumpAndSettle方法之后才能起作用