问题
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 OCMoc
k 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?
回答1:
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.
回答2:
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.
来源:https://stackoverflow.com/questions/10653531/ocmock-an-nsoperation