创建 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
的模拟:
首先,声明 GIDGoogleUser
和 GIDProfileData
将遵守的协议,以及我们稍后将制作的模拟:
protocol GoogleUserProtocol {
associatedtype Profile: ProfileDataProtocol
var profile: Profile! { get }
}
protocol ProfileDataProtocol {
var name: String! { get }
}
然后,让 GIDGoogleUser
和 GIDProfileData
遵守这些协议:
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
我正在编写一些单元测试,我需要创建一个 GIDGoogleUser 的模拟实例以确保我的 API returns 是我的模型用户 class 的正确实例GIDGoogleUser 中字段的子集。
由于 GIDGoogleUser 没有公开初始值设定项,并且它的所有属性都是只读的,所以我无法创建模拟实例并将其注入到我的转换器中。有什么办法可以做到这一点吗?
为简单起见,这就是我正在做的事情:
struct User {
let name: String
init(googleUser: GIDGoogleUser) {
name = googleUser.profile.name
}
}
我不确定你说你不能模拟是什么意思GIDGoogleUser
。这是我刚才制作的 GIDGoogleUser
的模拟:
首先,声明 GIDGoogleUser
和 GIDProfileData
将遵守的协议,以及我们稍后将制作的模拟:
protocol GoogleUserProtocol {
associatedtype Profile: ProfileDataProtocol
var profile: Profile! { get }
}
protocol ProfileDataProtocol {
var name: String! { get }
}
然后,让 GIDGoogleUser
和 GIDProfileData
遵守这些协议:
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