OCMock an NSOperation
I am trying to write some Unit Tests to test some custom NSOperations that we are writing. What I'd like to do is create a Mock of the NSOperation and put it on the NSOperationQueue, and then wait for it to finish. I know I can swizzle the methods and not use OCMock at all, but I really don't want to do that. I'd like to use OCMock. The code I'm trying to run is something like the following:
MYOperation *operation = [MYOperation new]; id mockOperation = [OCMockObject partialMockForObject:operation]; [NSOperationQueue *queue = [NSOperationQueue new]; [queue setMaxConcurrentOperationCount:1]; [queue addOperation:mockOperation];
When the unit test gets to this line:
I get a call to a deallocated object exception. Anyone have any suggestions on how I can overcome this?
If you're using ARC, operation is probably released right after you create the mock, as it's not accessed again. If you change it to this, it should fix the error:
...which you should be doing anyways--you're testing your object, not the mock.
When using ARC the reference to the object in mockOperation will be set to nil quite aggressively (too aggressively I think) by the Apple runtime. Not all is lost, though. You can set up your stubs and expectations using mockOperation and still pass operation to the addOperation: method; the partial mock works even when you use a reference to the original object.