Iphone 模拟NSO操作

Iphone 模拟NSO操作,iphone,objective-c,unit-testing,ocmock,Iphone,Objective C,Unit Testing,Ocmock,我正在尝试编写一些单元测试来测试我们正在编写的一些自定义操作。我想做的是创建一个模拟的NSOperation,并将其放在NSOperationQueue上,然后等待它完成。我知道我可以随意使用这些方法,而不使用OCMoc,但我真的不想这样做。我想使用OCMock。我尝试运行的代码如下所示: MYOperation *operation = [MYOperation new]; id mockOperation = [OCMockObject partialMockForObject:operat

我正在尝试编写一些单元测试来测试我们正在编写的一些自定义操作。我想做的是创建一个模拟的
NSOperation
,并将其放在
NSOperationQueue
上,然后等待它完成。我知道我可以随意使用这些方法,而不使用OCMoc,但我真的不想这样做。我想使用
OCMock
。我尝试运行的代码如下所示:

MYOperation *operation = [MYOperation new];
id mockOperation = [OCMockObject partialMockForObject:operation];
[NSOperationQueue *queue = [NSOperationQueue new];
[queue setMaxConcurrentOperationCount:1];
[queue addOperation:mockOperation];
当单元测试到达这一行时:

[queue addOperation:mockOperation];

我得到一个对解除分配对象异常的调用。有人对我如何克服这个问题有什么建议吗?

如果您使用的是ARC,
操作可能会在您创建模拟后立即发布,因为它不会被再次访问。如果将其更改为此,则应修复错误:

[queue addOperation:operation];

…无论如何,你都应该这么做--你在测试你的对象,而不是模拟

当使用ARC时,Apple运行时会非常积极地(我认为过于积极地)将mockOperation中的对象引用设置为nil。不过,并不是所有的东西都丢了。您可以使用mockOperation设置存根和期望,并且仍然将操作传递给addOperation:方法;即使在使用对原始对象的引用时,部分模拟仍然有效。

这种方法的问题是,如果我在模拟上存根一个方法,它会被执行还是在实际操作中执行该方法?对于部分模拟,如果你存根/期望一个方法,该方法将在模拟而不是实际对象上被调用。部分模拟提供了一种截获发送到对象的特定消息的方法。从:
当使用对某个对象的引用而不是mock调用stubbed方法时,它仍将由mock处理。
在启用ARC时,Apple运行时中存在影响OCMock的已知问题。详情如下: