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 は自己、1 は _cmd であると記載されているため、installedOnly は 2 で、completedHandler は 3 である必要があると考えています。これらのインデックスが正しく機能しない理由を理解したいだけです (おそらくプリミティブ型の何か?)
編集:もちろん、私は愚かです...- (FBRequestConnection*)startWithCompletionHandler:(FBRequestHandler)handler
ハンドラーがインデックス2にあるFBRequestのメソッドをモックしていました。将来誰かがOCMockでブロックスタブを必要とする場合に備えて、質問を残しています。`