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

前端之家收集整理的这篇文章主要介绍了ios – 两个类,回调和单元测试前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个静态方法的类:这个类把调用包裹到Twitter API

在第二类中,我有一些业务逻辑.

由于封装类中某些方法的异步行为,我设计通信时遇到困难.这是我做的:

APIManager.swift

  1. public class APIManager {
  2. class func getPermission(callback : () -> Void) {
  3.  
  4. let accountStore = ACAccountStore()
  5. let accountType =
  6. ACAccountStore().accountTypeWithAccountTypeIdentifier(ACAccountTypeIdentifierTwitter)
  7.  
  8. let callbackRequestAccess = { (granted: Bool,error: NSError!) -> Void in
  9. ...
  10. if(granted) {
  11. callback()
  12. }
  13.  
  14. }
  15.  
  16. accountStore.requestAccessToAccountsWithType(setAccountType,options: nil,completion: callbackRequestAccess)
  17.  
  18. }
  19. }

Welcome.swift

  1. public class Welcome {
  2.  
  3. public func checkPermission() {
  4. APIManager.getPermission(getTweet)
  5. }
  6. public func getTweet() {
  7. ...
  8. }
  9. }

我不确定这个设计是否对.
我不想在这些类之间有很强的联系,这就是为什么我使用回调.

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

解决方法

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

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

如果TwitterConnection协议变大,您应该强烈地考虑将其拆分成更小的协议,例如处理较少事物的TwitterAuthenticator和TweetFetcher(即使单个类型实际上实现了所有这些协议).这可以使测试更容易,允许您的测试类型仅实现几个功能,而不是几十个.

使用闭包可能很好,但是您应该更紧密地关注Cocoa命名约定.你所说的回调通常称为完成.我也可以跟随可可的领先方法.而不是getPermission(),它将是requestAccessWithCompletionHandler().这将有助于调用者了解它与requestAccessToAccountsWithType(options:completion :)的行为非常相似.不要为呼叫者建立新的词汇表.

猜你在找的iOS相关文章