我正在尝试设置单元测试以使用最新的facebook SDK并遇到问题......
这是我的代码:
[FBSession setDefaultAppID: @"323351877676429"];
FBTestSession *session = [FBTestSession sessionWithSharedUserWithPermissions: [NSArray array]];
STAssertNotNil(session, @"could not create test session");
[FBTestSession openActiveSessionWithReadPermissions:@[]
allowLoginUI:NO
completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
NSLog(@"completed");
[FBSession setActiveSession: session];
STAssertNil(error, error.description);
STAssertNotNil(FBSession.activeSession, @"FBSession missing");
STAssertNotNil(FBSession.activeSession.accessTokenData, @"FBSession missing");
STAssertNotNil(FBSession.activeSession.accessTokenData.accessToken, @"facebook token is nil");
STAssertNotNil(session, @"FBSession missing");
STAssertNotNil(session.accessTokenData, @"FBSession missing");
STAssertNotNil(session.accessTokenData.accessToken, @"facebook token is nil");
userModel *userM = [[userModel alloc] init];
[userM awakeFromNib];
} ];
这很有效,除了因为它以异步方式运行,当我的测试运行时,会话没有准备就绪,因此我有session.accessTokenData == nil。,这使我的其他测试失败。
如果我在openSession调用之后将下面的代码添加到我的设置方法中,那么setup方法永远不会返回。
while (!FBSession.activeSession.accessTokenData)
[NSThread sleepForTimeInterval:.2];
在某处有正确使用FBTestSession的例子吗?关于如何进行的任何线索?
谢谢,奥利维尔
答案 0 :(得分:1)
你很接近,你只需要等到块完成。这是一个可以用作参考的工作示例(略微缩短/修改)。
- (void)testFacebookLogin {
__block bool blockFinished = NO;
FBTestSession *fbSession = [FBTestSession sessionWithSharedUserWithPermissions:@[@"email"]];
[fbSession openWithCompletionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
NSLog(@"session %@, status %d, error %@", session, status, error);
[FBSession setActiveSession:session];
FBRequest *me = [FBRequest requestForMe];
NSLog(@"me request %@", me);
[me startWithCompletionHandler: ^(FBRequestConnection *connection,
NSDictionary<FBGraphUser> *my,
NSError *error) {
STAssertNotNil(my.id, @"id shouldn't be nil");
blockFinished = YES;
}];
}];
// Run loop
NSDate *loopUntil = [NSDate dateWithTimeIntervalSinceNow:10];
while (blockFinished == NO && [loopUntil timeIntervalSinceNow] > 0) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
beforeDate:loopUntil];
}
}