【问题标题】:How to write a test for a stateful widget?如何为有状态小部件编写测试?
【发布时间】:2019-09-02 23:17:04
【问题描述】:

我有一个状态小部件,其状态取决于异步 firebase 数据库读取调用。在获取数据时,我会显示一个等待循环指示器。一旦数据获取完成,我将显示实际的 ListView 小部件。

我想编写一个小部件测试来测试此功能。 如何在我的测试中设置 isReadComplete = true 的值?要么 如何从我的测试中显式调用 success_callback()?

bool isReadComplete;

App(){
   isReadComplete = false;

   firestore.collection('collection').document('doc').get().then((doc) {
      success_callback(doc.data);
    }).catchError((error) => {});
}


void success_callback(var data){
   setState((){
      isReadComplete = true;
   })
}

@override
  Widget build(BuildContext context) {
    if (!isReadComplete) {
      return new CircularIndicator();
    } else {
      List<Widget> widgetList = [];      
      return Scaffold(
          body: ListView(
        padding: EdgeInsets.all(8.0),
        children: widgetList,
      ));
    }
  }

// Test for CircularProgressIndicator

testWidgets("Check CircularProgressIndicator", (WidgetTester tester) async {

      await tester.pumpWidget(new MaterialApp(home: App));

      // This works fine since isReadComplete = false
      expect(find.byType(CircularProgressIndicator), findsOneWidget);
    });

// Test for ListView

testWidgets("Check ListView", (WidgetTester tester) async {

      await tester.pumpWidget(new MaterialApp(home: App));

      // How do I do this? 
      // How to call success_callback()?
      // How to set isReadComplete = true?
      expect(find.byType(ListView), findsOneWidget);
    });

【问题讨论】:

  • 是什么导致success_callback 被调用?您需要重现导致success_callback 调用的原因,然后从测试中的状态对象中读取值。有一个测试有状态小部件的示例here
  • 即数据库调用成功后的回调。我现在把它放在代码中。我不想在测试中进行数据库读/写。
  • 你找到了吗?
  • 不,我没有。但我相信这可以通过将代码移动到控制器类来完成。

标签: firebase flutter google-cloud-firestore widget flutter-test


【解决方案1】:

pumpWidget() 之后,您需要调用 pump() 并设置 Duration 以侦听 Future 是否在设定的时间内完成。 pump() 的替代方法是 pumpAndSettle() - 它至少调用一次 pump,并且可以在给定的持续时间内重复调用 pump

await tester.pumpWidget(new MaterialApp(home: App));
await tester.pumpAndSettle();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-14
    • 2019-10-06
    • 2020-04-11
    • 2021-09-21
    • 2021-02-16
    • 2020-05-10
    • 2021-05-19
    • 2020-08-06
    相关资源
    最近更新 更多