如何在 Flutter 小部件中测试回调函数

Posted

技术标签:

【中文标题】如何在 Flutter 小部件中测试回调函数【英文标题】:How to test a callback function in a Flutter widget 【发布时间】:2020-02-26 05:33:37 【问题描述】:

我有一个自定义的 Flutter 小部件 Radioselect,它在按下其中一个选项时接受一组选项和一个回调函数。使用作为唯一参数传递的选定选项调用回调。我正在尝试编写一个测试来验证回调是否被调用并检查返回的参数是否正确,但我不确定如何构造它。检查独立回调函数是否被调用的明智方法是什么?

  await tester.pumpWidget(
    StatefulBuilder(
      builder: (BuildContext context, StateSetter setState) 
        return MaterialApp(
          home:  RadioSelect(
                                ["option1","option2", "option3"], 
                                // callback function passed here
                                ),
            );
      ,
    ),
  );

expect(find.text('option1'), findsOneWidget);

await tester.press(find.text('option2'));

await tester.pump();

// test for callback here

【问题讨论】:

【参考方案1】:

在回调函数的主体中,您可以打印接收到的参数,然后期待它是否正确打印。

这是另一个进行类似测试的示例:

测试小工具的孩子:

...
...

Checkbox(
     key: Key('StatusCheckBox'),
     value: isCompleted,
     onChanged: (_) => toggleCompletionStatus(),
 ),

...
...

我将 print('Call') 作为 toggleCompletionStatus() 的主体传递

可以这样测试:

expectLater(
        () => tester.tap(find.byKey(Key('StatusCheckBox'))), prints('Call\n'));

【讨论】:

以上是关于如何在 Flutter 小部件中测试回调函数的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:来自后退导航的回调产生“错误状态:调用关闭后无法添加新事件”

Flutter:是不是可以替换小部件本身?

颤振回调到后退按钮上的原始小部件

在构建异常期间调用的 setState() 或 markNeedsBuild() 阻止我执行回调

Flutter 中的状态更新

Dojo:在事件侦听器回调中维护对小部件的引用