我如何在 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()); 这样的一些基本小部件似乎不需要额外的上下文。此外,如果小部件内部已经有MaterialAppScaffold,则不需要将其包装在另一个MaterialAppScaffold 中。所以这取决于。 好的。感谢您的帮助 :) 非常感谢。 我应该注意,您可以改为将 AddShimmer(child: childWidget) 包装在 Directionality 小部件中,正如错误消息所暗示的那样,但是您会收到另一个错误,指出它需要在 Material 小部件中,然后在MediaQuery 内,以此类推。根据我的经验,包裹在 MaterialAppScaffold 中恰好更容易。

以上是关于我如何在 Flutter 测试中做到这一点的主要内容,如果未能解决你的问题,请参考以下文章

在 Flutter 中创建图像轮播

使用 Flutter 测试 Firebase 云消息传递

如何在 Flutter 中为用户输入验证和 maxLength 创建一个简单的单元测试,并且具有空安全性

如何在 Flutter 中将 Hero 动画添加到我的 ListView?

如何在flutter中获取TextField值

如何在flutter中调用函数后刷新页面?