Flutter Widget测试报错:No Firebase App has been created异常排查
我正在为Flutter Web主页编写Widget测试用例,测试代码如下:
void main(){ group("test cases for main screen page after login",(){ testWidgets("should have one title for the page on top", (widgetTester) async { //Arrange await widgetTester.pumpWidget(const MaterialApp(home:MainScreenPage())); //Act Finder titleBookTracker = find.byKey(const ValueKey("text_title_main")); //Assert expect(titleBookTracker, findsOneWidget); }); }); }
我的主页MainScreenPage中使用Firebase相关功能加载并向Firestore数据库提交数据。运行上述测试用例时,出现以下异常:
══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
The following FirebaseException was thrown building MainScreenPage(dirty):
[core/no-app] No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()The relevant error-causing widget was: MainScreenPage
MainScreenPage:file:///home/StudioProjects/book_repository_sample/test/main_screen_page_test.dart:9:60
错误指向第9行的import 'package:cloud_firestore/cloud_firestore.dart';语句,请问这是什么原因?
原因及解决方法
原因
你的MainScreenPage依赖Firebase功能(比如Firestore),但测试环境中未初始化Firebase,组件构建时尝试调用Firebase相关方法,触发了core/no-app异常。错误指向Firestore的导入语句,是因为该导入会引入Firebase核心模块的依赖,组件初始化时会自动关联Firebase服务检查,此时Firebase App还未创建,所以抛出异常。
解决方法
有两种常见处理方式:
在测试中初始化Firebase
在测试代码的main函数或测试前置步骤中,调用Firebase初始化方法,使用测试环境的Firebase配置:import 'package:firebase_core/firebase_core.dart'; import 'package:flutter_test/flutter_test.dart'; void main(){ setUpAll(() async { // 初始化Firebase测试环境 await Firebase.initializeApp( options: const FirebaseOptions( apiKey: "你的测试API_KEY", authDomain: "你的测试AUTH_DOMAIN", projectId: "你的测试PROJECT_ID", storageBucket: "你的测试STORAGE_BUCKET", messagingSenderId: "你的测试SENDER_ID", appId: "你的测试APP_ID", ), ); }); group("test cases for main screen page after login",(){ testWidgets("should have one title for the page on top", (widgetTester) async { await widgetTester.pumpWidget(const MaterialApp(home:MainScreenPage())); Finder titleBookTracker = find.byKey(const ValueKey("text_title_main")); expect(titleBookTracker, findsOneWidget); }); }); }Mock Firebase依赖(UI测试推荐)
如果测试仅关注UI元素(比如标题是否存在),不需要真实Firestore交互,可使用mockito模拟Firebase服务,隔离外部依赖:- 先在
pubspec.yaml的dev_dependencies中添加依赖:dev_dependencies: mockito: ^5.4.0 build_runner: ^2.4.4 - 生成Mock类并注入测试:
import 'package:mockito/mockito.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:flutter_test/flutter_test.dart'; // 生成MockFirestore类 class MockFirestore extends Mock implements FirebaseFirestore {} class MockCollectionReference extends Mock implements CollectionReference {} void main(){ late MockFirestore mockFirestore; setUp(() { mockFirestore = MockFirestore(); // Mock Firestore的collection方法 when(mockFirestore.collection(any)).thenReturn(MockCollectionReference()); }); group("test cases for main screen page after login",(){ testWidgets("should have one title for the page on top", (widgetTester) async { // 假设MainScreenPage通过构造函数接收Firestore实例 await widgetTester.pumpWidget(MaterialApp(home:MainScreenPage(firestore: mockFirestore))); Finder titleBookTracker = find.byKey(const ValueKey("text_title_main")); expect(titleBookTracker, findsOneWidget); }); }); }
这种方式避免依赖真实Firebase服务,测试速度更快且不受网络影响,更适合纯UI验证的测试场景。
- 先在
内容的提问来源于stack exchange,提问作者Jaimin Modi

