背景
- FlutterでFirebaseを組み込んだアプリのWidgetテストを行おうとすると、一向にテストが終わらない現象が発生したので備忘録として残します。
- 結論として、Firebase.initializeApp()がプラットフォーム上でないと動作しないために発生している事象のようなので、Mockを用意してあげることで解決しました。
コード
- testWidgetの中でFirebaseを初期化しようとしています。これがないとWidgetテスト実行時に
No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()
と怒られていたために記述していました。
該当コード
void main() {
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
// Build our app and trigger a frame.
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
await tester.pumpWidget(const MyApp());
expect(find.text('Flutter x Firebase'), findsOneWidget);
解決方法
- 代わりにFirebaseのmockを用意します。
- stackoverflowのこちらのコメントを参考にしています。
修正後のコード
import '../mock.dart';
void main() {
// Firebaseをmockしないとwidgetのテストが終わらない。
setupFirebaseAuthMocks();
setUpAll(() async {
await Firebase.initializeApp();
});
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
// Build our app and trigger a frame.
await tester.pumpWidget(const MyApp());
expect(find.text('Flutter x Firebase'), findsOneWidget);
mock.dart
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// URL:https://stackoverflow.com/questions/63662031/how-to-mock-the-firebaseapp-in-flutter/64730015#64730015
import 'package:firebase_core_platform_interface/firebase_core_platform_interface.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
typedef Callback = void Function(MethodCall call);
void setupFirebaseAuthMocks([Callback? customHandlers]) {
TestWidgetsFlutterBinding.ensureInitialized();
setupFirebaseCoreMocks();
}
Future<T> neverEndingFuture<T>() async {
// ignore: literal_only_boolean_expressions
while (true) {
await Future.delayed(const Duration(minutes: 5));
}
}