两个类,回调和单元测试

Max*_*Max 10 asynchronous ios swift

我有一个静态方法的类:这个类包装了对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)

    }
}
Run Code Online (Sandbox Code Playgroud)

Welcome.swift

public class Welcome {

    public func checkPermission() {
        APIManager.getPermission(getTweet)
    } 
    public func getTweet() {
        ...
    }        
}
Run Code Online (Sandbox Code Playgroud)

我不确定这个设计是否合适.我不想在这些类之间建立强大的联系,这就是我使用回调的原因.

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

Rob*_*ier 7

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

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

如果TwitterConnection协议变大,你应该认真考虑拆分成更小的协议,如TwitterAuthenticatorTweetFetcher该处理的事情少(即使单一类型的实际实现所有这些协议).通过允许您的测试类型仅实现几个函数而不是几十个函数,这可以使测试更容易.

闭包的使用可能很好,但你应该更贴近Cocoa命名约定.callback传统上称之为你所称的是什么completion.我还会关注Cocoa在如何命名方法方面的领先优势.而不是getPermission(),它会requestAccessWithCompletionHandler().这将有助于调用者理解它具有非常类似的行为requestAccessToAccountsWithType(options:completion:).不要为调用者构建新的词汇表.