我正在尝试测试一段代码,在其中检查帐户是否已经创建了密钥并将其存储在钥匙串中。如果不是,它会调用一个启动 oauth 进程的方法。
如果用户没有密钥,我的第一个想法是覆盖我想调用的方法。但是我使用的是结构,因此无法继承和覆盖该方法。
如果我正在使用一个类,我会这样:
func testInitiateOauthCalledIfSecretKeyNotFound() {
class MockKeychainAccess: KeychainAccess {
var initiateAuthorizationWasCalled: Bool = false
override initiateAuthorization() {
initiateAuthorizationWasCalled = true
}
let keychainAccess = MockKeychainAccess()
keychainAccess.authorizeWithGoogle()
XCTAssertTrue(initiateAuthorizationWasCalled)
}
我还没有测试过这段代码,所以不确定它是否可以编译。但是从逻辑上讲,它似乎可以处理我所追求的情况。如果在authorizeWithGoogle
我们调用的方法内,initiateAuthorization()
那么我会知道这已经发生了。但是,当他们使用结构时不能这样做,因为我们不能从结构继承。
请注意:我是 TDD 新手,所以也许我想错了。欢迎提出其他建议。但是,我不想仅仅为了编写测试而从结构转换为类。我正在使用结构,因为我想变得更快。
有谁知道我可以测试一个函数是否在结构中被调用的方法?
==========
编辑:
为了回应 dasdom 的回答,我添加了一个我试图实现的一般方法的示例:
override func viewDidLoad() {
setupView()
let api = DataApi()
getData(api)
}
func setupView() {
tableView.dataSource = tableViewDataSource
}
func getData(api: DataApi) {
api.getApplicationData( { (objects) in
if let applications = objects as? [Application] {
self.tableViewDataSource.setApplicationItems(applications)
self.tableView.reloadData()
}
else {
// Display error
}
})
}
所以我想注入 MockDataApi 以便它可以返回我想要的,因为该方法采用一种 DataApi。但是我不确定我应该如何创建这个 MockDataApi 结构并将其传递给这个方法。
有人可以帮助了解如何为此目的构建这个模拟对象并使用它吗?我意识到它与协议有关,但很难将它拼凑在一起。