Я пытаюсь написать блок кода с помощью OCMock stub и методаDo.
В этом случае тестируется класс расширения UIImageView. Я хочу проверить, что расширение вызывает [self setImage:] с параметром, который не равен нулю (позже будет использовано другое сравнение изображений).
При использовании метода OCMock иDo тест завершается с EXC_BAD_ACCESS после завершения блока.
id mockView = [OCMockObject mockForClass:[UIImageView class]];
[[[mockView stub] andDo:^(NSInvocation *invocation)
{
UIImage *img;
[invocation getArgument:&img atIndex:2]; <---- line causing the exception
somebodySetImage |= (img != nil);
}] setImage:OCMOCK_ANY];
[mockView do_something_that_calls_setImage];
Единственное решение, которое я нашел сейчас, - это использование andCall вместо andDo, но это усложняет тест.
Можно ли избежать аварии с помощью &Do?
UPDATE Хорошо, я постараюсь дать лучший пример здесь: Вот новый фрагмент тестового кода:
- (void)testDownloadingThumbnail
{
PInfo *_sut = [[PInfo alloc] init];
__block id target = nil;
id mock = [OCMockObject mockForClass:[NSOperationQueue class]];
[[[mock expect] andDo:^(NSInvocation *inv)
{
NSInvocationOperation *op;
[inv getArgument:&op atIndex:2];
target = [[op invocation] target]; /* replacing this line with STAssert does not help either */
}] addOperation:OCMOCK_ANY];
[_sut setDownloadQueue:mock];
[_sut startDownloadingImagesAsync:YES];
[mock verify];
STAssertEqualObjects(target, _sut, @"invalid op target");
}
Вот проверенный код (единственный метод из PInfo):
- (void)startDownloadingImagesAsync:(bool)isThumbnailImg
{
NSInvocationOperation *inv;
inv = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(loadThumbnailWorker:)
object:nil];
[[self downloadQueue] addOperation:inv];
}
Код по-прежнему сбой при выходе из startDownloadingImagesAsync с EXC_BAD_ACCESS. Если я добавлю точку останова внутри блока andDo, я вижу, что элемент управления достигает этой точки и возвращает правильные объекты через getArgument.
Тем не менее, если я использую getArgument внутри блока, он сбрасывает все, что я пытаюсь сделать.
P.S. Спасибо за помощь.