我如何在 Flutter 测试中做到这一点
Posted
技术标签:
【中文标题】我如何在 Flutter 测试中做到这一点【英文标题】:How can I do this in Flutter Testing 【发布时间】:2022-01-21 19:15:10 【问题描述】:我是 Flutter 测试的新手,希望您能帮助我。我有一个名为 AddShimmer 的类,看起来像这样 ->
AddShimmer(
child: ListTile(
title: buildLoadingAnimation(context),
),
),
现在,我正在尝试编写一个颤振测试,只是为了检查一个子小部件是否正在传递给 AddShimmer 类。为此,我正在写这样的东西->
testWidgets('Shimmer has a child widget', (WidgetTester tester) async
const childWidget = ListTile(
title: Text('Loading'),
);
await tester.pumpWidget(
const AddShimmer(child: childWidget)
);
expect(find.byWidget(childWidget), findsOneWidget);
);
当我执行测试时,我得到一个异常,上面写着 ->
The following assertion was thrown building ListTile(dirty):
No Directionality widget found.
ListTile widgets require a Directionality widget ancestor.
The specific widget that could not find a Directionality ancestor was:
ListTile
这是什么意思以及如何测试它??
【问题讨论】:
【参考方案1】:基本上,flutter 需要一些额外的上下文来渲染小部件。我通常只是将它包裹在 Scaffold
中的 MaterialApp
中。
await tester.pumpWidget(
const MaterialApp(
home: Scaffold(
body: AddShimmer(child: childWidget),
),
),
);
【讨论】:
知道了!我需要为我编写的每个测试用例都这样做吗?我的意思是那里的所有小部件?全部包含在 Scaffold 和材料应用程序中? 像await tester.pumpWidget(Container());
这样的一些基本小部件似乎不需要额外的上下文。此外,如果小部件内部已经有MaterialApp
和Scaffold
,则不需要将其包装在另一个MaterialApp
和Scaffold
中。所以这取决于。
好的。感谢您的帮助 :) 非常感谢。
我应该注意,您可以改为将 AddShimmer(child: childWidget)
包装在 Directionality
小部件中,正如错误消息所暗示的那样,但是您会收到另一个错误,指出它需要在 Material
小部件中,然后在MediaQuery
内,以此类推。根据我的经验,包裹在 MaterialApp
和 Scaffold
中恰好更容易。以上是关于我如何在 Flutter 测试中做到这一点的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Flutter 中为用户输入验证和 maxLength 创建一个简单的单元测试,并且具有空安全性