2

我有一个 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'),
            ),
          ],
    ))
4

1 回答 1

3

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

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

什么是

在持续时间后触发一帧。

这使得框架的行为就像应用程序在持续时间内卡顿(丢失帧),然后接收到垂直同步信号来绘制应用程序。

什么是PumpAndSettle

以给定的持续时间反复调用泵,直到不再有任何帧调度。这将至少调用一次 pump,即使在调用该函数时没有调度任何帧,以刷新任何可能自己调度帧的挂起的微任务。

//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方法后才有效

于 2018-07-22T10:49:06.887 回答