NSInvocation getArgument:atIndex: путаница при тестировании блоков с помощью OCMock

Я пишу юнит-тесты в свою оболочку Facebook SDK, и что-то меня запутало в NSInvocation - (void)getArgument:(void *)buffer atIndex:(NSInteger)index при попытке издеваться над FBRequest с помощью OCMock.

Вот определение метода, которое я пытаюсь проверить.

-(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.
}];
}

Когда я передаю 3 в качестве индекса в методе NSInvocation, я получаю сообщение о том, что индекс 3 выходит за пределы. Но в документации сказано, что индекс 0 - это сам, 1 - _cmd, поэтому я считаю, что для параметра selectedOnly должно быть 2, а для параметра extensionHandler - 3. Я поиграл с ним, и передача 2 для индекса возвращает мне желаемый обработчик завершения и тестовые работы. Я просто хочу понять, почему эти индексы работают неправильно (может быть, что-то с примитивными типами?)

РЕДАКТИРОВАТЬ: Конечно, глупый меня... Я издевался над FBRequest - (FBRequestConnection*)startWithCompletionHandler:(FBRequestHandler)handler метод, где обработчик находится в индексе 2. Я оставляю вопрос на тот случай, если кому-то понадобится заглушка блока с помощью OCMock в будущем. `

0 ответов

Другие вопросы по тегам