如何为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
相关产品推荐
相关产品推荐

