我想模拟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);
}];
}
答案 0 :(得分:1)
OCMStub([[mockManager alloc]init]).andReturn(mockManager);
那不行。您遇到的问题是您的生产代码具有锁定的依赖关系:
FBSDKLoginManager* loginManager = [[FBSDKLoginManager alloc]init];
为了让您的测试代码提供"测试双" (代表真实事物的东西),你需要一种方法来注入它。
依赖注入有多种方法。你可以把它作为初始化器参数。你可以把它变成一个属性。如果希望FBSDKLoginManager是短命的,可以将它作为方法参数。
有关详情,请参阅How to Use Dependency Injection to Make Your Code Testable