【发布时间】:2021-05-24 12:35:00
【问题描述】:
我正在尝试在 Flutter 中执行基本的小部件测试。基本上我想要一个包含数据列表的列表,并在其中也有一个 ListTile 小部件的自定义小部件 (BasicListItem) 中显示每个项目。
根小部件:
class MyApp extends StatelessWidget {
final List taskList = ['List-1', 'List-2', 'List-3'];
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: Scaffold(
body: ListView.builder(
itemCount: taskList.length, itemBuilder: _itemBuilder),
),
);
}
Widget _itemBuilder(BuildContext context, int index) {
final String item = taskList[index];
return BasicListItem(key: Key(item), title: item);
}
}
列表项小部件 (BasicListItem) 采用标题,并在 ListTile 小部件中使用它。
class BasicListItem extends StatelessWidget {
final String title;
const BasicListItem({required Key key, required this.title})
: super(key: key);
@override
Widget build(BuildContext context) {
return ListTile(
leading: Icon(Icons.map),
title: Text(title),
);
}
}
这是对它的测试:
testWidgets('has title and Icons', (WidgetTester tester) async {
const testKey = Key('my-key-1');
const testTitle = 'Demo title';
await tester.pumpWidget(BasicListItem(key: testKey, title: testTitle));
expect(find.text(testTitle), findsOneWidget);
});
但是测试抛出错误:
未找到材质小部件。 ListTile 小部件需要一个 Material 小部件 祖先。
... ...
在运行测试时抛出了以下 TestFailure 对象:
预期:小部件树中只有一个匹配节点 实际: _TextFinder:
但是,如果我在 BasicListItem 构建方法中将 ListTile 包裹在 MaterialApp 周围,则测试确实通过。像这样:
@override
Widget build(BuildContext context) {
return MaterialApp(
title: title,
home: Scaffold(
body: ListTile(
leading: Icon(Icons.map),
title: Text(title),
),
)
);
}
但是这样做我不能在 ListView 小部件中使用它。而且我还想拥有模块化/单独的自定义小部件,以便我也可以在不同的地方使用它。我是新手,也许我错过了一些东西。如何构建自定义小部件并对其进行测试?请你帮帮我。
【问题讨论】:
标签: flutter flutter-test