我正在为我的 Facebook SDK 包装器编写单元测试,- (void)getArgument:(void *)buffer atIndex:(NSInteger)index
在尝试使用 OCMock 模拟 FBRequest 时,有些事情让我对 NSInvocation 感到困惑。
这是我要测试的方法定义。
-(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 传递给 index 让我得到了我想要的完成处理程序和测试工作。我只是想了解为什么这些索引工作错误(可能是原始类型的东西?)
编辑:当然,愚蠢的我......我在嘲笑 FBRequest 的- (FBRequestConnection*)startWithCompletionHandler:(FBRequestHandler)handler
方法,其中处理程序位于索引 2 处。我留下这个问题,以防将来有人需要使用 OCMock 进行块存根。`