Flutter集成Firebase实时数据库测试:通道连接建立失败
Flutter集成测试中Firebase初始化失败问题
我用Android Studio开发Flutter应用,采用Firebase作为实时数据库,想编写测试用例验证数据库的数据收发是否正常,但目前无法建立与数据库的连接。已经尝试过更新依赖,执行过以下命令:
flutter pub upgrade firebase_coreflutter pub upgrade firebase_messagingflutter cleanflutter pub outdatedflutter 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
相关产品推荐
相关产品推荐

