2013-03-12 79 views
0

我試圖建立我的單元測試使用最新的Facebook SDK和正在運行到問題的建立呼叫...如何使用FBTestSession與單元測試

這裏是我的代碼有:

[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調用之後將下面的代碼添加到我的設置方法中,那麼安裝方法永遠不會返回。

while (!FBSession.activeSession.accessTokenData) 
     [NSThread sleepForTimeInterval:.2]; 

是否有正確使用FBTestSession某處的個例?有關如何進行的任何線索?

感謝,奧利弗

回答

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]; 
    } 

} 
相關問題