5

我正在尝试编写一些单元测试来测试NSOperations我们正在编写的一些自定义。我想做的是创建一个 MockNSOperation并将其放在 上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];

我接到一个释放对象异常的调用。有人对我如何克服这个有任何建议吗?

4

2 回答 2

2

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

[queue addOperation:operation];

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

于 2012-05-21T17:45:07.850 回答
0

当使用 ARC 时,对mockOperation中对象的引用将被 Apple 运行时非常激进地(我认为过于激进)设置为 nil。不过,并非一切都丢失了。您可以使用mockOperation设置存根和期望,并且仍然将操作传递给 addOperation: 方法;即使您使用对原始对象的引用,部分模拟也可以工作。

于 2012-05-24T14:33:10.783 回答