我正在编写一个单元测试,它给我带来了麻烦。原来我可以只使用 OCMock 和普通的 obj-c 来重现这个问题。所以我在这里分享我的简单测试,它可以重现我的问题,希望有人可以帮助我理解为什么它会失败,以及我如何编写这个测试而不崩溃。
错误信息是EXC_BAD_ACCESS(code=2,address=0x58)
-(void)testIfNSOperationIsMockable {
NSOperationQueue *queue = [NSOperationQueue new];
queue.maxConcurrentOperationCount = 1;
[queue setSuspended:YES];
NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"I am a simple operation.");
}];
id mockOperation = [OCMockObject partialMockForObject:operation];
[[mockOperation expect] cancel];
[queue addOperation:mockOperation]; // chrash happens on this line
[queue cancelAllOperations];
[queue setSuspended:NO];
[mockOperation verify];
}
我知道这可能看起来像一个愚蠢的测试,但在我真正的单元测试中,队列被包装在一个管理器中,操作是一个自定义实现,并且取消是由包装器发送的,并且只针对一个特定的操作,所以请耐心等待和我过于简单的测试。