我正在编写Flutter Web应用程序,并将一些小部件测试添加到我的代码库中。我难以按预期进行flutter_test的工作。我目前面临的问题是尝试在DropdownButton中选择一个值。
下面是重现该问题的完整的窗口小部件测试代码:
void main() {
group('description', () {
testWidgets('description', (WidgetTester tester) async {
await tester.pumpWidget(MaterialApp(
home: Card(
child: Column(
children: [
Expanded(
child: DropdownButton(
key: Key('LEVEL'),
items: [
DropdownMenuItem<String>(
key: Key('Greater'),
value: 'Greater',
child: Text('Greater'),
),
DropdownMenuItem<String>(
key: Key('Lesser'),
value: 'Lesser',
child: Text('Lesser'),
),
],
onChanged: (value) {
print('$value');
},
value: 'Lesser',
),
)
],
),
),
));
expect((tester.widget(find.byKey(Key('LEVEL'))) as DropdownButton).value,
equals('Lesser'));
await tester.tap(find.byKey(Key('LEVEL')));
await tester.tap(find.byKey(Key('Greater')));
await tester.pumpAndSettle();
expect((tester.widget(find.byKey(Key('LEVEL'))) as DropdownButton).value,
equals('Greater'));
});
});
}
此测试未能达到最终期望-expect(widget.value, equals('Greater'));
正如我在调试器中看到的那样,或者在输出中寻找我的print语句时,永远不会调用onChanged回调。
测试DropdownButton行为的神奇之处是什么?
答案 0 :(得分:0)
尽管测试很重要,但在与用户交互相关的任何代码之后添加tester.pump()
调用。
下拉按钮的测试与普通小部件略有不同。对于所有情况,最好参考here,它是下拉按钮的实际测试。
测试时有些提示。
DropDownMenuItem
分配的键和文本。tester.pump
。value
的{{1}}属性不会自动更改。必须使用DropdownButton
进行设置。因此,最后的断言行是错误的,除非将测试用here之类的setState
包装,否则测试将无效。有关如何使用StatefulBuilder
的更多详细信息,请选中此post
DropDownButton