OCMock an NSOperation

↘锁芯ラ 提交于 2020-01-02 04:46:23

问题


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?


回答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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!