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:

[queue addOperation:mockOperation];

I get a call to a deallocated object exception. Anyone have any suggestions on how I can overcome this?

Answers


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:

[queue addOperation:operation];

...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.


Need Your Help

Continuous integration with ClearCase and long-updating snapshot views

continuous-integration hudson clearcase luntbuild snapshot-view

I need to set up a continuous integration system. We use ClearCase version control and only snapshot views due to platform restrictions. I have tried setting up Hudson and Luntbuild. They both show...