Flutter 颤振-如何正确地对FutureBuilder进行单元测试

Flutter 颤振-如何正确地对FutureBuilder进行单元测试,flutter,asynchronous,flutter-test,flutter-futurebuilder,flutter-future,Flutter,Asynchronous,Flutter Test,Flutter Futurebuilder,Flutter Future,我试图在FutureBuilder中对小部件进行单元测试,但我想不通 我有一个小部件,它有一个FutureBuilder,当连接状态完成时,它会返回一个CameraPreview小部件: body: FutureBuilder<void>( future: _initializeControllerFuture, builder: (context, snapshot) { if (snapshot.connectionState ==

我试图在
FutureBuilder
中对小部件进行单元测试,但我想不通

我有一个小部件,它有一个
FutureBuilder
,当连接状态完成时,它会返回一个
CameraPreview
小部件:

    body: FutureBuilder<void>(
      future: _initializeControllerFuture,
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.done) {
          // If the Future is complete, display the preview.
          return CameraPreview(_controller);
        } else {
          // Otherwise, display a loading indicator.
          return const Center(child: CircularProgressIndicator());
        }
      },
    ),
我已经对它进行了调试,
snapshot.connectionState
从未完成(总是等待),因此它跳过了返回
CameraPreview
的行。我也尝试了
tester.pumpandsolite()
,但它超时了


有什么想法吗?

是不是因为“
connectionState
从未完成”实际上处于错误状态?不确定摄像头插件在测试过程中的行为……我调试它时,它总是处于等待状态,您可以共享
\u initializeControllerFuture
的代码吗?也许这在单元测试期间永远不会回来,那么(?)当然,我已经把它添加到我的帖子中了。是的,这就是我的想法,它永远不会返回,但我不太确定如何在单元测试中模拟它。我明白了。那么,在父类中创建一个用@visibleForTesting注释的构造函数,它可以模拟
CameraController
?这样,您就可以重写
.initialize()
方法并确保它返回。。。
  Future<void> _initializeControllerFuture;

  @override
  void initState() {
    super.initState();
    // To display the current output from the Camera,
    // create a CameraController.
    _controller = CameraController(
      // Get a specific camera from the list of available cameras.
      widget.camera,
      // Define the resolution to use.
      ResolutionPreset.medium,
    );

    // Next, initialize the controller. This returns a Future.
    _initializeControllerFuture = _controller.initialize();
  }
testWidgets('Camera preview is available',
    (WidgetTester tester) async {
  await _buildCameraScreenPage(tester);
  await tester.pump();

  expect(find.byType(CameraPreview), findsOneWidget,
      reason: 'Camera preview should be visible.');
});