LoginSignup
2
1

More than 1 year has passed since last update.

FlutterのWidgetテストが終わらない現象の対応

Last updated at Posted at 2023-01-14

背景

  • FlutterでFirebaseを組み込んだアプリのWidgetテストを行おうとすると、一向にテストが終わらない現象が発生したので備忘録として残します。
    image.png
  • 結論として、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));
  }
}

これでひとまずテストが動作するようになりました。
image.png

参考リンク

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1