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

Flutter测试中Firebase Auth登录获取Id Token报错求助

解决方案

你的错误是因为普通单元测试(test())运行在纯Dart环境,没有Flutter平台通道支持,而Firebase Flutter SDK依赖原生平台通信,导致初始化失败。以下两种方案可以解决问题,获取有效的JWT Id Token:

方案一:直接调用Firebase Auth REST API(无需Flutter Firebase SDK)

绕开Flutter SDK的平台依赖,通过HTTP请求直接调用Firebase Auth的REST接口获取Token,适合单元测试场景。

实现步骤:

  1. 从Firebase控制台获取项目的Web API Key(路径:项目设置 → 通用 → Web应用 → API密钥)
  2. 编写登录并获取Token的方法:
import 'package:http/http.dart' as http;
import 'dart:convert';

Future<String> getFirebaseIdToken(String email, String password, String webApiKey) async {
  final response = await http.post(
    Uri.parse('https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=$webApiKey'),
    body: jsonEncode({
      'email': email,
      'password': password,
      'returnSecureToken': true,
    }),
  );

  if (response.statusCode == 200) {
    final data = jsonDecode(response.body);
    return data['idToken'];
  } else {
    throw Exception('登录失败:${response.body}');
  }
}
  1. 在测试中使用该方法:
import 'package:flutter_test/flutter_test.dart';

// 你的自定义导入

void main() {
  group('messageRepository', () {
    late final String jwt;
    
    setUp(() async {
      const webApiKey = '你的Firebase Web API Key';
      jwt = await getFirebaseIdToken('<REDACTED>', '<REDACTED>', webApiKey);
    });

    test('message repository 测试', () async {
      List<SingleRecipientMessageHeader> messages =
          await MessageRepository().fetchMessages(jwt);
      // 后续测试逻辑
    });
  });
}

方案二:使用集成测试(在真实设备/模拟器运行)

改用integration_test包,在真实设备或模拟器上运行测试,这里有完整的平台环境,能正常初始化Firebase SDK。

实现步骤:

  1. 在pubspec.yaml添加依赖:
dev_dependencies:
  integration_test:
    sdk: flutter
  flutter_test:
    sdk: flutter
  1. 创建集成测试文件(如test/integration/message_repo_test.dart):
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
import 'package:firebase_auth/firebase_auth.dart' as firebase_auth;

// 你的自定义导入

void main() {
  IntegrationTestWidgetsFlutterBinding.ensureInitialized();

  group('messageRepository', () {
    late final String? jwt;
    
    setUp(() async {
      await Firebase.initializeApp(
        options: DefaultFirebaseOptions.android, // 对应测试平台的Options
      );
      final instance = firebase_auth.FirebaseAuth.instance;

      await instance.signInWithEmailAndPassword(
          email: "<REDACTED>", password: "<REDACTED>");
      jwt = await instance.currentUser?.getIdToken();
    });

    tearDown(() async {
      await firebase_auth.FirebaseAuth.instance.signOut();
    });

    testWidgets('message repository 集成测试', (tester) async {
      List<SingleRecipientMessageHeader> messages =
          await MessageRepository().fetchMessages(jwt!);
      // 后续测试逻辑,如验证消息列表合法性
    });
  });
}
  1. 运行测试(替换<device_id>为你的设备ID):
flutter test integration_test/message_repo_test.dart -d <device_id>

内容的提问来源于stack exchange,提问作者Pierre Massé

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 04:45:35