有没有任何方法可以对FirebaseAuth通过电子邮件注册后返回用户模型的函数进行单元测试



目前,我正在努力提高我的测试技能。因此,我尝试测试一个函数,该函数使用电子邮件和密码创建一个新用户,并返回带有用户和电子邮件UID的UserModel。但我还是停留在如何测试这一点上。我试过使用mokito,但它没有通过测试,因为UID返回null。以下是我想要测试的功能。

Future<dynamic> createNewAdmin({
@required email,
@required String password,
}) async {
try {
await firebaseAuth.createUserWithEmailAndPassword(
email: email, password: password);
User signedUser = firebaseAuth.currentUser;
adminModel = AdminModel(
adminEmail: email,
adminUID: signedUser.uid,
);
print(adminModel);
return adminModel;
} on FirebaseAuthException catch (e) {
if (e.code == 'weak-password') {
return 'weak_password';
} else if (e.code == 'email-already-in-use') {
return 'email-already-in-use';
}
} catch (e) {
rethrow;
}
}

这是我写的测试。但这是不完整的,有人能告诉我我测试返回类型是否与预期输出匹配吗

test('when new admin signed up succesfully Then return true', () async {
when(mockFirebaseAuth.createUserWithEmailAndPassword(
email: "test@gmail.com", password: "12345678"))
.thenAnswer((_) => Future<MockAuthResult>.value());
expect(
await adminRepository.createNewAdmin(
email: 'test@gmail.com',
password: '12345678',
),
AdminModel(adminEmail: "test@gmail.com", adminUID: ?));
});

您需要将FirebaseAuth作为依赖项传递以模拟它。

Future<dynamic> createNewAdmin({
@required email,
@required String password,
FirebaseAuth firebaseAuth
}) async {
try {
await firebaseAuth.createUserWithEmailAndPassword(
email: email, password: password);
User signedUser = firebaseAuth.currentUser;
adminModel = AdminModel(
adminEmail: email,
adminUID: signedUser.uid,
);
print(adminModel);
return adminModel;
} on FirebaseAuthException catch (e) {
if (e.code == 'weak-password') {
return 'weak_password';
} else if (e.code == 'email-already-in-use') {
return 'email-already-in-use';
}
} catch (e) {
rethrow;
}
}

然后在测试中创建模拟实例

class MockFirebaseAuth extends Mock implements FirebaseAuth {}

最后,您可以传递实例,然后可以调用when方法。

test('when new admin signed up succesfully Then return true', () async {
when(mockFirebaseAuth.createUserWithEmailAndPassword(
email: "test@gmail.com", password: "12345678"))
.thenAnswer((_) async => [value you want to return]);
expect(
await adminRepository.createNewAdmin(
email: 'test@gmail.com',
password: '12345678',
firebaseAuth: mockFirebaseAuth,
),
AdminModel(adminEmail: "test@gmail.com", adminUID: ?));
});

最新更新