我正在构建一个原生的iOS应用程序,允许用户登录Facebook并“喜欢”Open Graph对象。我正在尝试为我的代码编写单元测试,这些代码执行内置的喜欢。我在Facebook应用程序的管理网页中创建了测试用户,我想在单元测试中做的是作为测试用户登录,“喜欢”打开图形对象,检查以确保'喜欢'的数量'改变,然后'不像'它。
我正在使用Facebook iOS SDK,它附带FBTestSession,我认为这对我的需求是完美的。我的理解是,它会随机抓取一个测试用户登录(如果你愿意,可以创建一个临时用户)。但是,有几个问题,我没有看到任何解释它的文档。
第一个问题:它尝试从Documents目录加载FacebookSDK-UnitTestConfig.plist以读取AppID和AppSecret。为了解决这个问题,我制作了这样一个文件,并在测试开始时将其复制到Documents目录。这是正确的做法吗?
第二个问题是,当我尝试打开测试会话时,它会抛出一个错误,包含400响应代码并且没有有用的消息。查看它尝试发出的请求,似乎是使用fql查询所有测试帐户。当我在网络浏览器中输入相应的URL
时 https://graph.facebook.com/fql?access_token=ACCESS_TOKEN&q=SELECT id,access_token FROM test_account WHERE app_id = APP_ID)
我收到错误消息“(#15)本机应用程序不支持此方法”。但很明显FBTestSession适用于本机应用程序,所以发生了什么?
答案 0 :(得分:1)
根据他们的文档,它不适用于应用程序代码:
http://developers.facebook.com/docs/reference/ios/3.0/class/FBTestSession
此方法不应在应用程序代码中使用 - 但对于创建使用Facebook SDK的单元测试非常有用。
答案 1 :(得分:1)
使用FBTestSession很简单,它会在打开时创建一个测试用户,并在关闭时将其销毁。您可以像经典会话一样使用会话(内部FBTestSession继承自FBSession):
FBSession *fbSession = [FBTestSession sessionWithPrivateUserWithPermissions:@[@"publish_stream", @"email"]];
[fbSession openWithCompletionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
// Test here, you can use the session.accessToken attribute
}
我在使用FacebookSDK-UnitTestConfig.plist
时遇到了一些麻烦,我认为Facebook SDK中有一些奇怪的东西,我查看了代码并构建了这个plist的路径,他们正在寻找文档目录:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *configFilename = [documentsDirectory stringByAppendingPathComponent:@"FacebookSDK-UnitTestConfig.plist"];
测试时,文档目录与我们在模拟器中执行App时不一样,我打印它是:
/Users/{user}/Library/Application Support/iPhone Simulator/{iOS_version}/Documents/
如果你把你的plist放在那里应该有效。 plist文件具有字典结构并包含2个键:FacebookAppID
和FacebookAppSecret
。
答案 2 :(得分:0)
只要是真的,因此不会给您的应用带来安全风险,请更改高级设置中的应用机密内置值Facebook应用否。这应该允许您使用您的应用访问令牌来请求测试用户信息。
如果您的应用确实在分布式本机代码中包含应用程序机密,则可能会发现该应用程序机密,从而导致应用程序的安全性受到损害。我认为这就是为什么当你有一个原生应用程序时,FB会默认启用此设置。