単体テストを書いていたのですが、問題が発生していました。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];
}
これはばかげたテストのように思えるかもしれませんが、私の実際の単体テストでは、キューはマネージャーにラップされ、操作はカスタム実装であり、キャンセルはラッパーによって送信され、特定の 1 つの操作のみを対象としています。そして私の過度に単純なテスト。