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

如何为FirebaseAuth邮箱注册后返回用户模型的函数编写单元测试

问题解决方法

你测试失败的核心原因是仅 mock 了 createUserWithEmailAndPassword 方法的返回结果,没有对 firebaseAuth 实例的 currentUser 属性、以及对应 User 实例的 uid 属性做 mock 配置,导致代码中获取 signedUser 时返回 null,最终无法拿到 uid。

具体实现步骤

  • 提前定义测试用的固定参数:测试邮箱、测试密码、固定测试UID
  • 初始化需要用到的Mock实例:MockFirebaseAuth、MockUser、MockUserCredential
  • 配置MockUser的uid属性返回固定测试UID
  • 配置MockFirebaseAuth的currentUser属性返回MockUser实例
  • 保持原有createUserWithEmailAndPassword的mock成功返回配置
  • 断言时传入对应测试参数即可匹配返回的AdminModel

完整测试代码示例

首先需要准备对应的Mock类(如果用空安全版本的Mockito,可通过注解自动生成):

import 'package:mockito/mockito.dart';
import 'package:firebase_auth/firebase_auth.dart';

class MockFirebaseAuth extends Mock implements FirebaseAuth {}
class MockUser extends Mock implements User {}
class MockUserCredential extends Mock implements UserCredential {}

测试主逻辑:

test('新管理员注册成功时返回正确的AdminModel', () async {
  // 定义测试固定参数
  const testEmail = "test@gmail.com";
  const testPassword = "12345678";
  const testUID = "test_uid_987654";

  // 初始化Mock实例
  final mockFirebaseAuth = MockFirebaseAuth();
  final mockUser = MockUser();
  final mockUserCredential = MockUserCredential();
  final adminRepository = AdminRepository(firebaseAuth: mockFirebaseAuth);

  // 配置mock返回逻辑
  when(mockUser.uid).thenReturn(testUID);
  when(mockFirebaseAuth.currentUser).thenReturn(mockUser);
  when(mockFirebaseAuth.createUserWithEmailAndPassword(
    email: testEmail, 
    password: testPassword
  )).thenAnswer((_) => Future.value(mockUserCredential));

  // 执行测试
  final result = await adminRepository.createNewAdmin(
    email: testEmail,
    password: testPassword,
  );

  // 断言结果
  // 注意:如果AdminModel没有重载==运算符和hashCode,需分开断言属性
  expect(result.adminEmail, testEmail);
  expect(result.adminUID, testUID);
  // 若重载了==可直接对比实例
  // expect(result, AdminModel(adminEmail: testEmail, adminUID: testUID));
});

补充:异常场景测试示例

以弱密码场景为例:

test('注册时密码强度不足返回weak_password', () async {
  const testEmail = "test@gmail.com";
  const testWeakPassword = "123";
  when(mockFirebaseAuth.createUserWithEmailAndPassword(
    email: testEmail, 
    password: testWeakPassword
  )).thenThrow(FirebaseAuthException(code: 'weak-password'));

  final result = await adminRepository.createNewAdmin(
    email: testEmail,
    password: testWeakPassword,
  );

  expect(result, 'weak_password');
});

内容的提问来源于stack exchange,提问作者Sayuru_Sandaru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 00:24:09