【问题标题】:How can I do this in Flutter Testing我如何在 Flutter 测试中做到这一点
【发布时间】: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

这是什么意思以及如何测试它??

【问题讨论】:

    标签: flutter dart testing widget widget-test-flutter


    【解决方案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 中恰好更容易。
    猜你喜欢
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    相关资源
    最近更新 更多