2017-08-13 105 views
2

我有一個簡單的函數來請求訪問,以便在日曆中添加事件。如何模擬EKEventStore

typealias BoolCallback = (Bool) ->() 

class SimpleCalendar { 

    let store: EKEventStore 

    init(store: EKEventStore = EKEventStore()) { 
     self.store = store 
    } 

    /// Request access to EventKit API for Calendar intergration 
    /// 
    /// - Parameter callback: returns if access was recived or denied 
    func requestAccess(callback: @escaping BoolCallback) { 

     let status = EKEventStore.authorizationStatus(for: .event) 

     switch status { 
     case .authorized: 
      callback(true) 
      //  case .notDetermined: //should ask for access 
     //  case .denied, .restricted: //should open a ask permission view 
     default: 
      store.requestAccess(to: .event) { accessGranted, _ in 

       DispatchQueue.main.async { 
        callback(accessGranted) 
       } 
      } 
     } 


    } 
} 

有沒有辦法模擬EKEventStore獲取狀態?

我也有一個簡單的函數來檢查日曆是否存在。

func doesCalendarExist(name: String) -> Bool { 
    let calendars = store.calendars(for: .event) 

    if calendars.contains(where: { $0.title == name }) { 
     return true 
    } 

    return false 
} 

有沒有辦法嘲笑存儲對象爲獲得store.calendars

感謝


我切換

let status = EKEventStore.authorizationStatus(for: .event) 

let status = type(of: store).authorizationStatus(for: .event) 
+0

請檢查新的更新 –

回答

1

我想你可以在這裏使用DI。取而代之的內創造店無功SimpleCalendar你可以爲它創建構造函數參數店把責任:EKEventStore,並將它傳遞有:

init(store: EKEventStore = EKEventStore()) {/*code*/} 

這樣,您就可以通過自己的模仿對象。

覆蓋類方法有什麼問題?我現在無法檢查,但假設這是可能的。

任何方式,其他選項是嘲笑你可以創建協議與您正在使用的所有方法 - EventStoreProtocol。這些方法必須是在EKEventStore我想,這樣你就可以很容易地使用擴展采納:

extension EKEventStore: EventStoreProtocol {} 

然後強似EKEventStore來構造,通過有EventStoreProtocol

你的模擬對象將不子類,而只是類確認到該協議,實現所有所需的方法

對於類的方法,而不是EKEventStore.authorizationStatus使用類型(組成:存儲).authorizationStatus

我能想到的關於你的問題的唯一的事情是下一個:

extension EKEventStore { 
    func eventAuthorizationStatus() -> EKAuthorizationStatus { 
     return EKEventStore.authorizationStatus(for: .event) 
    } 
} 

然後OVERR在子類中使用這個方法。因爲EKEventStoreNSObject,它應該工作(但我不確定)。這種方式,而不是使用類型(的:store).authorizationStatus您可以調用此方法。

但問題是 - 你真的需要這個嗎?你不能就這樣離開嗎?如果沒有,檢查這一做法,並告訴我,如果它的工作原理

+0

謝謝,這個工程的「doesCalendarExist」的功能,但你知道我怎麼可以模擬一個類的方法「EKEventStore.authorizationStatus」 – ilan

+0

@ilan,請檢查更新的答案 –

+0

再次感謝,我將用類方法解釋問題。 正如你所看到的我在代碼中調用'EKEventStore.authorizationStatus'這是一個類方法,所以我不能使用DI – ilan