gpt4 book ai didi

ios - 两个类,回调和单元测试

转载 作者:IT王子 更新时间:2023-10-29 05:36:46 25 4
gpt4 key购买 nike

我有一个带有静态方法的类:这个类包装了对 Twitter API 的调用

在第二堂课中,我有一些业务逻辑。

由于包装类中某些方法的异步行为,我很难设计通信。这是我所做的:

APIManager.swift

public class APIManager {
class func getPermission(callback : () -> Void) {

let accountStore = ACAccountStore()
let accountType =
ACAccountStore().accountTypeWithAccountTypeIdentifier(ACAccountTypeIdentifierTwitter)

let callbackRequestAccess = { (granted: Bool, error: NSError!) -> Void in
...
if(granted) {
callback()
}

}

accountStore.requestAccessToAccountsWithType(setAccountType,
options: nil, completion: callbackRequestAccess)

}
}

欢迎.swift

public class Welcome {

public func checkPermission() {
APIManager.getPermission(getTweet)
}
public func getTweet() {
...
}
}

我不确定这个设计是否正确。我不想在这些类之间有很强的联系,这就是我使用回调的原因。

这是经典设计吗?而且,我觉得这种行为不容易测试?

最佳答案

在这里不使用类方法将大大提高可测试性。创建一个 TwitterConnection 协议(protocol)。创建一个符合它的 SystemTwitterConnection 并通过 ACAccountStore 管理事物。创建一个 TestTwitterConnection,它返回您可以为测试配置的预设响应。您甚至可以创建一个 KeychainTwitterConnection 来手动管理 Twitter 登录,而无需使用 ACAccountStore,或者如果 Apple 推出另一种存储这些帐户的方法,则可以使用其他实现。

创建时将适当的连接传递给 Welcome

如果 TwitterConnection 协议(protocol)变大,您应该强烈考虑将其拆分成更小的协议(protocol),例如处理更少的 TwitterAuthenticatorTweetFetcher东西(即使一个类型实际上实现了所有这些协议(protocol))。这可以让您的测试类型只实现几个功能而不是几十个,从而使测试变得更加容易。

闭包的使用可能没问题,但您应该更严格地遵守 Cocoa 命名约定。您所谓的回调 传统上称为完成。我还将遵循 Cocoa 的指导如何命名方法。不是 getPermission(),而是 requestAccessWithCompletionHandler()。这将帮助调用者了解它与 requestAccessToAccountsWithType(options:completion:) 具有非常相似的行为。不要为来电者建立新词汇。

关于ios - 两个类,回调和单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31885349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com