创建 GIDGoogleUser 的模拟实例

Creating mock instances of GIDGoogleUser

我正在编写一些单元测试,我需要创建一个 GIDGoogleUser 的模拟实例以确保我的 API returns 是我的模型用户 class 的正确实例GIDGoogleUser 中字段的子集。

由于 GIDGoogleUser 没有公开初始值设定项,并且它的所有属性都是只读的,所以我无法创建模拟实例并将其注入到我的转换器中。有什么办法可以做到这一点吗?

为简单起见,这就是我正在做的事情:

struct User {
  let name: String

  init(googleUser: GIDGoogleUser) {
    name = googleUser.profile.name
  }
}

我不确定你说你不能模拟是什么意思GIDGoogleUser。这是我刚才制作的 GIDGoogleUser 的模拟:

首先,声明 GIDGoogleUserGIDProfileData 将遵守的协议,以及我们稍后将制作的模拟:

protocol GoogleUserProtocol {
    associatedtype Profile: ProfileDataProtocol
    var profile: Profile! { get }
}

protocol ProfileDataProtocol {
    var name: String! { get }
}

然后,让 GIDGoogleUserGIDProfileData 遵守这些协议:

extension GIDGoogleUser: GoogleUserProtocol {}
extension GIDProfileData: ProfileDataProtocol {}

然后,创建我们的模拟 类(或我在本例中选择的结构),并让它们符合上述协议:

struct MockGoogleUser: GoogleUserProtocol {
    let profile: MockProfileData!
}

struct MockProfileData: ProfileDataProtocol {
    let name: String!
}

最后,调整 User 的初始值设定项而不是 GIDGoogleUser,而是任何符合 GoogleUserProtocol:

的东西
struct User {
    let name: String

    init<G>(googleUser: G) where G: GoogleUserProtocol {
        name = googleUser.profile.name
    }
}

这将允许您创建模拟 Google 用户实例并将它们注入您的 User,如下所示:

let mockProfileData = MockProfileData(name: "Mock User Name")
let mockGoogleUser = MockGoogleUser(profile: mockProfileData)

let mockUser = User(googleUser: mockGoogleUser)

print(mockUser.name) // prints "Mock User Name"

你当然仍然可以使用 "real" Google 用户对象初始化你的 User:

let realGoogleUser: GIDGoogleUser = ... // get a GIDGoogleUser after signing in

let realUser = User(googleUser: realGoogleUser)

print(realUser.name) // prints whatever the real GIDGoogleUser's name is