You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter集成Firebase实时数据库测试:通道连接建立失败

Flutter集成测试中Firebase初始化失败问题

我用Android Studio开发Flutter应用,采用Firebase作为实时数据库,想编写测试用例验证数据库的数据收发是否正常,但目前无法建立与数据库的连接。已经尝试过更新依赖,执行过以下命令:

  • flutter pub upgrade firebase_core
  • flutter pub upgrade firebase_messaging
  • flutter clean
  • flutter pub outdated
  • flutter pub upgrade outdated_package

每次执行flutter test命令时,都会出现如下错误:

00:06 +0: app_test.dart: (setUpAll) Failed to initialize Firebase: PlatformException(channel-error, Unable to establish connection on channel.) package:firebase_core_platform_interface/src/pigeon/messages.pigeon.dart 210:7  FirebaseCoreHostApi.initializeCore To run this test again: dart.exe test app_test.dart -p vm --plain-name "(setUpAll)" 00:06 +0 -3: app_test.dart: 'INTEGRATION TEST - ADD MARKER ON MAP' [E] Assertion failed: '_pendingFrame == null' To run this test again: dart.exe test app_test.dart -p vm --plain-name "INTEGRATION TEST - ADD MARKER ON MAP" 00:06 +0 -4: app_test.dart: (tearDownAll) Warning: integration_test plugin was not detected. If running with flutter drive, use flutter test $path_to_test instead. 

相关代码文件

app_test.dart

import 'package:cobol_lab/firebase_options.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:integration_test/integration_test.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:cobol_lab/main.dart' as app;

void main() {
 IntegrationTestWidgetsFlutterBinding.ensureInitialized();

setUpAll(() async {
await Firebase.initializeApp(
  options: DefaultFirebaseOptions.currentPlatform,
);
});

testWidgets("INTEGRATION TEST - MAP OPENING", (WidgetTester tester) async {
app.main();
await tester.pumpAndSettle();

// 检查地图是否加载
expect(find.byType(GoogleMap), findsOneWidget);
});

testWidgets("INTEGRATION TEST - ADD MARKER ON MAP", (WidgetTester tester) async {
  app.main();
await tester.pumpAndSettle();

// 模拟点击添加标记的按钮
await tester.tap(find.byIcon(Icons.add_location));
await tester.pumpAndSettle();

expect(find.text("INSERT NEW ADDRESS"), findsOneWidget);
});
}

my_map_test.dart

import 'package:cobol_lab/firebase_options.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:cobol_lab/mappa.dart';

void main() {
  setUpAll(() async {
   TestWidgetsFlutterBinding.ensureInitialized();
   await Firebase.initializeApp(
      options: DefaultFirebaseOptions.currentPlatform,
   );
  });

  test("Test inizializzazione MyMap", () {
   final myMap = MyMap();
   expect(myMap, isNotNull);
 });
}

pubspec.yaml依赖配置

dependencies:
  sdk: flutter
  cupertino_icons: ^1.0.6
  google_maps_flutter: ^2.6.0
  google_maps_flutter_web: ^0.5.6+2
  location: ^5.0.3
  fluttertoast: ^8.0.8
  geocoding: ^2.0.0
  firebase_core: ^2.28.0
  firebase_auth: ^4.18.0
  firebase_database: 10.4.11
dev_dependencies:
  flutter_test:
    sdk: flutter
  integration_test:
    sdk: flutter

解决建议

1. 区分单元测试与集成测试的运行逻辑

  • 单元测试(如my_map_test.dart):在VM环境运行,无法调用原生Firebase通道,不要直接初始化真实Firebase。改用Firebase模拟器或Mock Firebase实例,避免依赖原生平台功能。
  • 集成测试(如app_test.dart):必须在真实设备或模拟器上运行,不能用普通flutter test命令。将测试文件放在项目根目录的integration_test文件夹下(无则创建),执行命令:flutter test integration_test/app_test.dart。

2. 配置Firebase模拟器进行测试

在测试代码中指定使用模拟器,避免连接真实生产数据库:

setUpAll(() async {
  IntegrationTestWidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );
  // 连接数据库模拟器
  FirebaseDatabase.instance.useDatabaseEmulator('localhost', 9000);
});

启动模拟器命令:firebase emulators:start --only database

3. 修复测试中的重复初始化问题

app_test.dart中每个testWidgets都调用app.main()会导致App和Firebase重复初始化,引发状态冲突。调整为在setUpAll中只初始化一次:

void main() {
  IntegrationTestWidgetsFlutterBinding.ensureInitialized();

  setUpAll(() async {
    await Firebase.initializeApp(
      options: DefaultFirebaseOptions.currentPlatform,
    );
    app.main();
    await tester.pumpAndSettle();
  });

  testWidgets("INTEGRATION TEST - MAP OPENING", (WidgetTester tester) async {
    // 直接检查,无需再次启动app
    expect(find.byType(GoogleMap), findsOneWidget);
  });

  testWidgets("INTEGRATION TEST - ADD MARKER ON MAP", (WidgetTester tester) async {
    await tester.tap(find.byIcon(Icons.add_location));
    await tester.pumpAndSettle();
    expect(find.text("INSERT NEW ADDRESS"), findsOneWidget);
  });
}

4. 统一Firebase依赖版本

执行命令升级所有Firebase相关依赖到最新稳定版,确保版本兼容:
flutter pub upgrade firebase_core firebase_database firebase_auth

5. 检查Firebase配置文件

确认firebase_options.dart已针对测试平台(Android/iOS)正确生成,配置信息与Firebase控制台一致。

内容的提问来源于stack exchange,提问作者kmp222

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 03:44:58