EXC_BAD_ACCESS podczas uzyskiwania dostępu do parametrów w andDo OCMock
Próbuję napisać blok kodu za pomocą kodu pośredniczącego OCMocki robić metoda.
W tym przypadku testowana jest klasa rozszerzenia UIImageView. Chcę sprawdzić, czy połączenia z numerem wewnętrznym[self setImage:] z parametrem, który nie jest zerowy (później zostanie użyte inne porównanie obrazu).
Podczas korzystania z OCMock'si robić metoda, test ulega awarii z EXC_BAD_ACCESS po zakończeniu bloku.
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];
Jedyne rozwiązanie, które znalazłem na razie, wykorzystujei zadzwoń zamiasti robić, ale to komplikuje test.
Czy mogę uniknąć zderzenia zi robić?
AKTUALIZACJA Cóż, postaram się podać tutaj lepszy przykład: oto nowy fragment kodu testowego:
- (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");
}
Oto testowany kod (pojedyncza metoda z PInfo):
- (void)startDownloadingImagesAsync:(bool)isThumbnailImg
{
NSInvocationOperation *inv;
inv = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(loadThumbnailWorker:)
object:nil];
[[self downloadQueue] addOperation:inv];
}
Kod nadal ulega awarii po wyjściu zstartDownloadingImagesAsync z EXC_BAD_ACCESS. Jeśli dodam punkt przerwania wewnątrzi robić Blok, widzę, że kontrolka osiąga ten punkt i pobiera prawidłowe obiekty przezgetArgument.
Ale jeśli użyjęgetArgument wewnątrz bloku rozbija wszystko, co próbuję zrobić.
P.S. Dzięki za pomoc.