OCMock an NSOperation

5
我正在尝试编写一些单元测试来测试我们编写的一些自定义 NSOperations。我想做的是创建一个 NSOperation 的模拟对象并将其放在 NSOperationQueue 上,然后等待它完成。我知道我可以交换方法而不使用 OCMock,但我真的不想这样做。我想使用 OCMock。我正在尝试运行的代码类似于以下内容:
MYOperation *operation = [MYOperation new];
id mockOperation = [OCMockObject partialMockForObject:operation];
[NSOperationQueue *queue = [NSOperationQueue new];
[queue setMaxConcurrentOperationCount:1];
[queue addOperation:mockOperation];

当单元测试到达这行代码时:
[queue addOperation:mockOperation];

我遇到了一个对象被释放的异常。你有什么建议可以帮助我解决这个问题吗?


当启用ARC时,苹果运行时存在一个已知问题会影响OCMock。更多详情请参考:http://www.mulle-kybernetik.com/forum/viewtopic.php?f=4&t=252 - Erik Doernenburg
2个回答

2
如果您正在使用ARC,operation在创建模拟对象后可能会被立即释放,因为它不再被访问。如果您将其更改为以下内容,则应该可以解决错误:
[queue addOperation:operation];

...无论如何都应该这样做——你正在测试你的对象,而不是模拟。


这种方法的问题在于,如果我在 Mock 对象上存根(stub)一个方法,那么它会被执行,还是它会执行实际 Operation 上的方法? - Nick Cipollina
使用部分模拟,如果您存根/期望一个方法,该方法将在模拟上调用而不是实际对象。部分模拟提供了一种拦截发送到对象的特定消息的方式。来自OCMock文档当使用对anObject的引用调用存根方法时,而不是模拟,它仍将由模拟处理。 - Christopher Pickslay

0

当使用ARC时,对于mockOperation中的对象引用会被苹果运行时非常积极地(我认为是过于积极了)设置为nil。但并不是所有的都失去了。您仍然可以使用mockOperation设置您的存根和期望,并将operation传递给addOperation:方法;即使使用对原始对象的引用,部分模拟也可以工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接