OCMock facebook块模拟

时间:2016-02-28 17:02:41

标签: facebook block ocmock

我想模拟facebook登录块,但测试失败,未调用该块。请帮我解决问题。

//Test
-(void)testFacebookLogin
{
    id mockManager = OCMClassMock([FBSDKLoginManager class]);
    OCMStub([[mockManager alloc]init]).andReturn(mockManager);
    FBSDKLoginManagerLoginResult *res = [[FBSDKLoginManagerLoginResult alloc]initWithToken:nil isCancelled:YES grantedPermissions:nil declinedPermissions:nil];
    NSError* err = [NSError errorWithDomain:@"This is an error" code:NSURLErrorNotConnectedToInternet userInfo:nil];
    [[mockManager stub]logInWithReadPermissions:OCMOCK_ANY fromViewController:OCMOCK_ANY handler:[OCMArg invokeBlockWithArgs:res,err,nil]];
    __block BOOL invoke;
    [LoginHelper facebookLoginWithLoginResult:^(BOOL success, NSError *error, id result) {
        invoke = YES;
    }];
    XCTAssertTrue(invoke);
}
//LoginHelper.m 
    +(void)facebookLoginWithLoginResult:(LoginResult)loginResult
    {
        UIViewController* currentRootViewController = AppDelegateHelperSingleton.globalDelegate.window.rootViewController;
        FBSDKLoginManager* loginManager = [[FBSDKLoginManager alloc]init];
        loginManager.loginBehavior = FBSDKLoginBehaviorNative;
        NSArray* permissions = @[@"email",@"public_profile",@"user_birthday"];
//facebook login with read permisssions
        [loginManager logInWithReadPermissions:permissions fromViewController:currentRootViewController handler:^(FBSDKLoginManagerLoginResult *result, NSError *error)
        {
            loginResult(result, error);
        }];
    }

1 个答案:

答案 0 :(得分:1)

OCMStub([[mockManager alloc]init]).andReturn(mockManager);

那不行。您遇到的问题是您的生产代码具有锁定的依赖关系:

FBSDKLoginManager* loginManager = [[FBSDKLoginManager alloc]init];

为了让您的测试代码提供"测试双" (代表真实事物的东西),你需要一种方法来注入它。

依赖注入有多种方法。你可以把它作为初始化器参数。你可以把它变成一个属性。如果希望FBSDKLoginManager是短命的,可以将它作为方法参数。

有关详情,请参阅How to Use Dependency Injection to Make Your Code Testable