我想注入或假冒登录TwitterKit iOS SDK。我试图为我的库编写一些单元测试(这是最重要的Twitter API的包装)。
不幸的是,Fabric要求用户设置系统帐户或显示OAuth屏幕。是否有办法伪造该登录以使我的测试API调用成功?
任何建议都会非常感激。
答案 0 :(得分:4)
这取决于您尝试编写的测试类型以及您是否在测试期间实际尝试发出网络请求。
如果您正在编写必须通过登录流程完成的集成测试,最简单的方法是通过创建自己的ACAccountStore
将帐户添加到ACAccountCredential
。这种方法的一个缺点是,它将在系统管理的幕后进行网络调用,因此无法拦截/模拟它,这可能会使您的测试变得不稳定。一旦您将该帐户添加到商店,只要您尝试完成登录流程,就会获得该帐户。
如果您使用-[TWTRAPIClient sendTwitterRequest:completion:]
方法发出网络请求,并且您实际上需要在这些调用期间登录,因为您尝试访问Twitter API,则可以直接向TWTRSessionStore
添加会话致电[TWTRSessionStore saveSessionWithAuthToken:authTokenSecret:completion:]
。同样,这种方法会进行难以模拟/拦截的网络调用,但如果您在测试期间提出实际的网络请求,这种情况并不重要。
如果您正在编写不需要发出网络请求的单元测试,但您需要在TWTRSessionStore
中进行会话,则可以直接在TWTRSessionStore
中保存会话。您可以使用自己创建的会话拨打-[TWTRSessionStore saveSession:withVerification:completion:]
,无需验证。请注意,此方法是私密的,如有更改,恕不另行通知。话虽如此,我真的没有理由为什么我们会很快改变它,所以你应该安全使用它。
如果这些都不适合你,请让我更具体地了解你想要完成的事情,我可以建议其他选择。
答案 1 :(得分:0)
我使用了与此类似的函数来创建一个单元或集成测试的示例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()
})
}