Firebase 如何为有状态小部件编写测试?

Firebase 如何为有状态小部件编写测试?,firebase,flutter,google-cloud-firestore,widget,flutter-test,Firebase,Flutter,Google Cloud Firestore,Widget,Flutter Test,我有一个有状态的小部件,其状态取决于异步firebase数据库读取调用。在提取数据时,我会显示一个等待的循环指示器。数据获取完成后,我将显示实际的ListView小部件 我想写一个小部件测试来测试这个功能。 如何在测试中设置isReadComplete=true的值?或 如何从测试中显式调用success\u callback() bool isReadComplete; App(){ isReadComplete = false; firestore.collection('c

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

我想写一个小部件测试来测试这个功能。 如何在测试中设置isReadComplete=true的值?或 如何从测试中显式调用success\u 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);
    });
bool已完成;
App(){
isReadComplete=false;
firestore.collection('collection')。document('doc')。get()。然后((doc){
成功回调(单据数据);
}).catchError((error)=>{});
}
无效成功回调(var数据){
设置状态(){
isReadComplete=true;
})
}
@凌驾
小部件构建(构建上下文){
如果(!isReadComplete){
返回新的循环指示器();
}否则{
列表widgetList=[];
返回脚手架(
正文:ListView(
填充:边缘设置。全部(8.0),
孩子们:widgetList,
));
}
}
//循环压缩机指示器试验
testWidgets(“Check CircularProgressIndicator”,(WidgetTester测试仪)异步{
等待测试人员。pumpWidget(新材料App(主页:App));
//这可以正常工作,因为isReadComplete=false
expect(find.byType(CircularProgressIndicator)、findsOneWidget);
});
//ListView的测试
testWidgets(“检查列表视图”,(WidgetTester测试仪)异步{
等待测试人员。pumpWidget(新材料App(主页:App));
//我该怎么做?
//如何调用success_callback()?
//如何设置isReadComplete=true?
expect(find.byType(ListView)、findsOneWidget);
});

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