2016-02-28 46 views
0

我想嘲笑facebook登錄塊,但測試失敗,該塊沒有被調用。請幫我解決問題。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
OCMStub([[mockManager alloc]init]).andReturn(mockManager); 

這是行不通的。你所面臨的問題是,你的產品代碼具有它鎖定了一個依賴性:

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

爲了讓你的測試代碼提供一個「測試雙」(一些真實的東西矗立在),你需要一種注入方式。

依賴注入有多種方法。你可以使它成爲一個初始化參數。你可以把它變成財產。如果你想FBSDKLoginManager是短暫的,你可以把它作爲一個方法參數。

欲瞭解更多信息,請參閱Dependency Injection: Unlock Your Code, Make It Testable

+0

喬恩像往常一樣是對的。然而,使用OCMock時,有一種(相當髒的)黑客攻擊,當你不控制類時,它可以作爲最後的手段。只要依賴對象沒有使用簡單的init方法初始化,或者alloc/init可以更改爲'new',那麼就可以存儲'new'方法或alloc/initWith ...方法來返回模擬。參見9.3節。在參考文檔中。 –