【发布时间】:2015-07-06 14:19:09
【问题描述】:
运行此测试时,有时我会收到 EXC_BAD_ACCESS:
- (void)testThatItDoesNotSaveLoadedImageIfNotIntializedWithModifiesFileCacheOption {
id cacheMock = OCMClassMock([BEImageCache class]);
id imageLoaderMock = OCMClassMock([BEImageLoader class]);
BETwoLayerCacheImageProvider *imageProvider = [[BETwoLayerCacheImageProvider alloc] initWithCache:cacheMock imageLoader:imageLoaderMock options:0 scale:2.f];
UIImage *expectedImage = [UIImage new];
[[cacheMock reject] saveImageAtURLInFileCache:[OCMArg any] forURL:[OCMArg any]];
[[cacheMock reject] saveImageInFileCache:[OCMArg any] forURL:[OCMArg any]];
__block NSURL *URL = [NSURL fileURLWithPath:@"/file:///fixtureURL"];
__block typeof(self) welf = self;
OCMStub([imageLoaderMock downloadImageWithURL:[OCMArg any] completionCallback:[OCMArg any]]).andDo(^(NSInvocation *invocation) {
///[invocation retainArguments];
void (^callback)(UIImage *image, NSError *error, NSString *imageURL, NSURL *temporaryImageURL) = nil;
[invocation getArgument:&callback atIndex:3];
callback(expectedImage, nil, welf.smallImageURL, URL);
});
[imageProvider fetchImageForImageData:self.imageData size:self.smallImageSize withCompletionCallback:^(UIImage *anImage, id<BEImageAware> imageData, CGSize requestedSize) {
OCMVerifyAll(cacheMock);
}];
}
EXC_BAD_ACCESS 发生在这里:
- (void)forwardInvocationForClassObject:(NSInvocation *)anInvocation
{
// in here "self" is a reference to the real class, not the mock
OCClassMockObject *mock = OCMGetAssociatedMockForClass((Class) self, YES);
if(mock == nil)
{
[NSException raise:NSInternalInconsistencyException format:@"No mock for class %@", NSStringFromClass((Class)self)];
}
if([mock handleInvocation:anInvocation] == NO)
{
[anInvocation setSelector:OCMAliasForOriginalSelector([anInvocation selector])];
[anInvocation invoke]; /// EXC_BAD_ACCESS
}
}
奇怪的是,当我只运行这一项测试时,它永远不会崩溃,但当我调整所有测试(使用 cmd+u)时,我几乎总是崩溃。
我尝试添加[invocation retainArguments],但没有帮助,我认为不应该在这里。
有人遇到过这样的问题吗?
【问题讨论】:
-
失败的堆栈跟踪中有什么有趣的地方吗?如果您运行除此之外的所有测试,它们是否始终通过?
标签: objective-c unit-testing memory-management ocmock