NSInvocation getArgument:atIndex:使用OCMock测试块时出现混乱

时间:2013-07-28 12:00:45

标签: objective-c objective-c-blocks ocunit ocmock nsinvocation

我正在为我的Facebook SDK包装器编写单元测试,并且在尝试使用OCMock模拟FBRequest时,让我对NSInvocation的- (void)getArgument:(void *)buffer atIndex:(NSInteger)index感到困惑。

这是我试图测试的方法定义。

-(void) friendListInstalledOnly:(BOOL) installedOnly withCompletionHandler:(FacebookHelperCompletionHandler)handler

其中FacebookHelperCompletionHandler是一个typedef,如下所示:

typedef void (^FacebookHelperCompletionHandler)(id result, NSError  *error);

这是我的测试方法

-(void) testFriendsListInstalledOnly {

id mockRequest = [OCMockObject mockForClass:[FBRequest class]];

NSArray *friendsArray = [NSArray arrayWithObjects:
                         @{@"id":@(1),@"name":@"Kaan"},
                         @{@"id":@(2),@"name":@"Mumtaz",@"installed":@(1)},
                         @{@"id":@(3),@"name":@"Toprak",@"installed":@(0)},
                         @{@"id":@(4),@"name":@"Yeter"},nil];

NSDictionary<FBGraphObject> *responseDictionary = [FBGraphObject graphObjectWrappingDictionary:@{@"data":friendsArray}];

[[mockRequest expect] setGraphPath:[OCMArg any]];

[[[mockRequest expect] andDo:^(NSInvocation *invocation) {

    FBRequestHandler requestHandler = nil;
    [invocation getArgument:&requestHandler atIndex:3];
    requestHandler(nil,responseDictionary,nil);

}] startWithCompletionHandler:[OCMArg any]];


self.facebookHelper.friendsRequest = mockRequest;

[self.facebookHelper friendListInstalledOnly:YES withCompletionHandler:^(id result, NSError *error) {
    NSLog(@"%@",result); // The actual assert will go here.
}];
}

当我在NSInvocation方法中传递3作为索引时,我得到一个错误,指出索引3超出范围。但文档说索引0是self,1是_cmd,所以我认为installedOnly应该是2,completionHandler应该是3.我玩它并传递2索引获取我想要的完成处理程序和测试工作。我只想了解为什么这些索引工作错误(可能是原始类型的东西?)

编辑:当然,愚蠢的我......我在嘲笑FBRequest的- (FBRequestConnection*)startWithCompletionHandler:(FBRequestHandler)handler方法,其中处理程序位于索引2.我将离开问题以防万一有人需要阻止将来与OCMock衔接。 `

0 个答案:

没有答案