2016-01-13 99 views
1

我想注入或僞造一個登錄到TwitterKit iOS SDK。我正在嘗試爲我的庫編寫一些單元測試(這是對最重要的Twitter API的封裝)。將註冊詳細信息注入TwitterKit

不幸的是,Fabric需要用戶設置系統帳戶或顯示OAuth屏幕。有什麼辦法可以僞造該登錄信息來使我的測試API調用成功嗎?

任何意見將非常感激。

回答

3

這取決於您正在嘗試寫什麼類型的測試以及測試過程中是否實際嘗試發出網絡請求。

如果您正在編寫必須通過登錄流程工作的集成測試,最簡單的方法是通過創建您自己的ACAccountCredential將帳戶添加到ACAccountStore。這種方法的一個缺點是,它會在系統管理的幕後進行網絡調用,所以無法攔截/嘲笑它,這可能會讓您的測試變得不穩定。一旦您將該賬戶添加到商店,只要您嘗試通過登錄流程,它就會被拿起。

如果您使用的是-[TWTRAPIClient sendTwitterRequest:completion:]方法進行網絡請求和實際需要,因爲你試圖擊中Twitter的API,你可以直接通過調用[TWTRSessionStore saveSessionWithAuthToken:authTokenSecret:completion:]會話添加到TWTRSessionStore在這些調用登錄。同樣,這種方法會產生一個很難模擬/攔截的網絡調用,但如果你在測試過程中提出了實際的網絡請求,這應該無關緊要。

如果您正在編寫不需要發出網絡請求的單元測試,但您需要在TWTRSessionStore中進行會話,則可以直接將會話保存在TWTRSessionStore中。您可以撥打-[TWTRSessionStore saveSession:withVerification:completion:]並創建一個沒有驗證的會話。請注意,這種方法是私人的,如有更改,恕不另行通知。就這樣說,我不認爲我們會很快改變它的任何理由,所以它應該是安全的使用。

如果這些都不適合你,請讓我更具體地瞭解你正在努力完成的任務,並且我可以建議其他選項。

+0

這是一個偉大的答案。我正在編寫單元測試,我很快會嘗試你提到的最後兩個選項。謝謝! – BalestraPatrick

+0

不幸的是TWTRSessionStore類沒有任何init方法。我怎樣才能看到我的授權令牌和祕密? – BalestraPatrick

+0

您可以從登錄時返回的會話對象中獲取它們。請參閱TWTRAuthSession。 – Chase

0

我用一個類似的功能insid的單位或集成測試創建示例Twitter的測試帳號:

static func addTestAccount(completion:()->()) { 
    let credential = ACAccountCredential(OAuthToken: TestAccountToken, tokenSecret: TestAccountSecret) 
    let store = ACAccountStore() 
    let type = store.accountTypeWithAccountTypeIdentifier(ACAccountTypeIdentifierTwitter) 
    let newAccount = ACAccount(accountType: type) 
    newAccount.credential = credential 
    newAccount.username = TestAccountUsername 

    store.saveAccount(newAccount, withCompletionHandler: { (success, error) -> Void in 
     print(success ? "Saved new account" : "Failed to save account \(error)") 
     completion() 
    }) 
} 
相關問題