首页 > 解决方案 > 需要模拟 Firebase Auth 但不确定如何

问题描述

我使用 Firebase 在我的应用中管理身份验证。这有一个登录用户的单例对象:Auth.auth().currentUser

在我的部分代码中,我检查uid登录用户的 是否等于userId与对象关联的 a 。

我需要测试使用此检查的代码。为此,我需要能够注入一个模拟 Firebase Auth 对象。

如何模拟 Firebase Auth 对象?有没有人有过这方面的经验?

标签: iosswiftfirebasefirebase-authentication

解决方案


所以我通过创建一些用于身份验证的协议并使其User符合该协议来解决这个问题:

protocol AuthUser {
    var uid: String {get}
    var displayName: String? {get}
    var email: String? {get}
    var photoURL: URL? {get}
}

extension User : AuthUser {}

protocol AuthenticationProtocol {
    var currentUser: AuthUser? {get}
}

然后我创建了一个Authentication符合以下条件的类AuthenticationProtocol

final class Authentication: AuthenticationProtocol {
    static let shared = Authentication()
    private let auth = Auth.auth()
    var currentUser: AuthUser? {
        return auth.currentUser
}

当我的应用程序中有一个需要身份验证的类时,我会注入一个符合以下条件的AuthenticationProtocol类:

final class MyClass {
    private let auth: AuthenticationProtocol

    init(auth: AuthenticationProtocol = Authentication.shared) {
        self.auth = auth
}

然后我可以通过调用获取当前登录用户的 id auth.currentUser?.uid

对于测试,然后我创建一个符合如下条件的模拟类AuthenticationProtocol

final class AuthenticationMock : AuthenticationProtocol {
    private let uid: String
    let currentUser: AuthUser?

    init(currentUser: AuthUser) {
        self.currentUser = currentUser
    }
}

然后我可以在我打电话时注入它MyClass(auth: <Authentication Mock Instance>)


推荐阅读