Flutter模拟Firebase认证插件firebase_auth_mocks的使用

发布于 1周前 作者 phonegap100 来自 Flutter

Flutter模拟Firebase认证插件firebase_auth_mocks的使用

firebase_auth_mocks 是一个用于模拟 Firebase 认证的 Dart 包,可以帮助开发者在不依赖实际 Firebase 服务的情况下进行单元测试。该包通常与 google_sign_in_mocks 一起使用,以模拟 Google 登录。

使用方法

添加依赖

首先,在 pubspec.yaml 文件中添加 firebase_auth_mocksgoogle_sign_in_mocks 到开发依赖项:

dev_dependencies:
  flutter_test:
    sdk: flutter
  firebase_auth_mocks: ^0.14.0
  google_sign_in_mocks: ^0.9.0

然后运行 flutter pub get 来安装这些依赖。

示例代码

以下是一个简单的示例,展示了如何使用 firebase_auth_mocks 模拟 Google 登录和 Firebase 认证:

import 'package:firebase_auth_mocks/firebase_auth_mocks.dart';
import 'package:google_sign_in_mocks/google_sign_in_mocks.dart';
import 'package:firebase_auth/firebase_auth.dart';

void main() async {
  // Mock sign in with Google.
  final googleSignIn = MockGoogleSignIn();
  final signinAccount = await googleSignIn.signIn();
  final googleAuth = await signinAccount.authentication;
  
  // Create a credential from the authentication result.
  final AuthCredential credential = GoogleAuthProvider.credential(
    accessToken: googleAuth.accessToken,
    idToken: googleAuth.idToken,
  );

  // Create a mock user.
  final user = MockUser(
    isAnonymous: false,
    uid: 'someuid',
    email: 'bob@somedomain.com',
    displayName: 'Bob',
  );

  // Initialize the mock Firebase Authentication instance.
  final auth = MockFirebaseAuth(mockUser: user);

  // Sign in with the credential.
  final result = await auth.signInWithCredential(credential);
  final signedInUser = result.user;

  // Print the display name of the signed-in user.
  print(signedInUser.displayName); // Output: Bob
}

更多功能

MockFirebaseAuth 支持多种功能,包括但不限于:

  • 初始化为已登录或未登录状态。
  • 触发 authStateChangesuserChanges 事件。
  • 支持多种登录方式,如 signInWithCredential, signInWithEmailAndPassword, signInAnonymously 等。
  • 发送密码重置邮件、验证电话号码等操作。

抛出异常

你可以配置 MockFirebaseAuth 在特定条件下抛出异常。例如:

不考虑参数情况

whenCalling(Invocation.method(#signInWithCredential, null))
  .on(auth)
  .thenThrow(FirebaseAuthException(code: 'bla'));

expect(
  () => auth.signInWithCredential(FakeAuthCredential()),
  throwsA(isA<FirebaseAuthException>()),
);

考虑位置参数

final auth = MockFirebaseAuth();
whenCalling(Invocation.method(
        #fetchSignInMethodsForEmail, ['someone@somewhere.com']))
    .on(auth)
    .thenThrow(FirebaseAuthException(code: 'bla'));

expect(() => auth.fetchSignInMethodsForEmail('someone@somewhere.com'),
    throwsA(isA<FirebaseAuthException>()));
expect(() => auth.fetchSignInMethodsForEmail('someoneelse@somewhereelse.com'),
    returnsNormally);

考虑命名参数

whenCalling(Invocation.method(
          #confirmPasswordReset, null, {#code: contains('code')}))
      .on(auth)
      .thenThrow(FirebaseAuthException(code: 'invalid-action-code'));

expect(
  () async => await auth.confirmPasswordReset(
    code: 'code',
    newPassword: 'password',
  ),
  throwsA(isA<FirebaseAuthException>()),
);
expect(
  () => auth.confirmPasswordReset(
    code: '10293',
    newPassword: 'password',
  ),
  returnsNormally);

兼容性表

firebase_auth 版本 firebase_auth_mocks 版本
5.0.0 0.14.0
4.0.0 0.9.0
3.5.0 0.8.7

功能请求和错误报告

如果你需要更多的功能或遇到任何问题,请在 issue tracker 上提交问题或建议。

通过使用 firebase_auth_mocks,你可以更轻松地编写和测试涉及 Firebase 认证的 Flutter 应用程序,而无需依赖真实的 Firebase 服务。


更多关于Flutter模拟Firebase认证插件firebase_auth_mocks的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter模拟Firebase认证插件firebase_auth_mocks的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter项目中,使用firebase_auth_mocks插件可以帮助你在不依赖实际的Firebase服务的情况下模拟Firebase认证流程。这对于单元测试特别有用,因为它允许你在不连接真实后端的情况下测试认证逻辑。

以下是一个如何在Flutter项目中使用firebase_auth_mocks插件的示例代码案例:

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加firebase_authfirebase_auth_mocks的依赖:

dependencies:
  flutter:
    sdk: flutter
  firebase_auth: ^3.3.5  # 请使用最新版本
  firebase_auth_mocks: ^0.6.0  # 请使用最新版本

dev_dependencies:
  test: ^1.17.0  # 测试框架

2. 导入必要的包

在你的测试文件中,导入必要的包:

import 'package:flutter_test/flutter_test.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_auth_mocks/firebase_auth_mocks.dart';

3. 设置模拟Firebase Auth实例

在测试初始化时,设置Firebase Auth的模拟实例:

void main() {
  // 创建一个模拟的FirebaseAuth实例
  late MockFirebaseAuth mockAuth;
  late UserCredential userCredential;
  late User mockUser;

  setUpAll(() {
    // 初始化模拟FirebaseAuth实例
    mockAuth = MockFirebaseAuth.instance();

    // 创建一个模拟的用户和用户凭证
    mockUser = MockUser(
      uid: 'testUserUid',
      email: 'test@example.com',
      phoneNumber: '+1234567890',
      displayName: 'Test User',
      photoURL: 'https://www.example.com/photo.png',
    );
    userCredential = UserCredential(
      user: mockUser,
      additionalUserInfo: null,
      credential: null,
    );

    // 配置模拟FirebaseAuth实例的行为
    when(mockAuth.currentUser).thenReturn(mockUser);
    when(mockAuth.signInWithEmailAndPassword(anyString(), anyString()))
        .thenAnswer((_) async => userCredential);
    when(mockAuth.createUserWithEmailAndPassword(anyString(), anyString()))
        .thenAnswer((_) async => userCredential);
  });

  tearDownAll(() {
    // 清理模拟实例
    mockAuth.close();
  });

  test('sign in with email and password', async () async {
    // 使用模拟的FirebaseAuth实例进行登录
    UserCredential result = await mockAuth.signInWithEmailAndPassword(
      'test@example.com',
      'password123',
    );

    // 验证结果
    expect(result.user!.uid, 'testUserUid');
    expect(result.user!.email, 'test@example.com');
  });

  test('create user with email and password', async () async {
    // 使用模拟的FirebaseAuth实例创建用户
    UserCredential result = await mockAuth.createUserWithEmailAndPassword(
      'newuser@example.com',
      'newpassword123',
    );

    // 验证结果
    expect(result.user!.uid, 'testUserUid');  // 注意:这里应该返回新用户的UID,但因为是模拟,所以返回的是预设值
    expect(result.user!.email, 'newuser@example.com');
  });
}

4. 运行测试

确保你的测试文件放置在test目录下,并使用以下命令运行测试:

flutter test

注意事项

  • MockFirebaseAuth.instance() 创建了一个全局的模拟FirebaseAuth实例,适用于整个测试套件。
  • 使用whenthenAnswer来定义模拟实例的行为。
  • 清理资源:在tearDownAll中调用mockAuth.close()来清理模拟实例。

通过这种方式,你可以在不依赖实际Firebase服务的情况下,对Firebase认证逻辑进行充分的单元测试。

回到顶部