0

最新の 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 呼び出しの後にセットアップ メソッドに以下のコードを追加すると、セットアップ メソッドが返されません。

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

どこかに FBTestSession の適切な使用例はありますか? 続行する方法についての手がかりはありますか?

ありがとう、オリヴィエ

4

1 に答える 1

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

}
于 2013-03-22T12:04:20.837 に答える