2

我正在尝试模拟传递给我的 SUT 的对象。传递时,SUT 将模拟注册为某些属性的观察者。在 SUT dealloc 中,它调用removeObserver模拟。这在 OCMockito 0.23 上工作得很好,但是当更新到 1.0.0 时,这个测试会使 OCMockito 陷入[HCIsEqual .cxx_destruct]. 稍微调试一下,引导我到MKTInvocationContainer方法:

- (void)setInvocationForPotentialStubbing:(NSInvocation *)invocation

其中调用被告知保留其参数。可能是一个保留周期?

此外,我一直在做一些研究,我发现了几个 SO 答案说明NSProxy和 KVO 之间的不兼容:

NSProxy 和键值观察

https://stackoverflow.com/a/17457155/2824409

但是,我想知道为什么这适用于 OCMockito 0.23 而不是现在。任何想法?

在我的情况下,解决方案是用真实对象替换模拟。这很好用,但是为几乎不使用它的测试套件构建整个对象是很痛苦的。

无论如何,如果 Mock 不支持 KVO,我相信这应该记录在案并妥善处理。

[编辑]

我找到了解决这个问题的方法。

我们正在使用基于自定义块的 KVO 基础设施,类似于此处描述的:http: //www.mikeash.com/pyblog/key-value-observing-done-right.html。现在,SUT 正在为 KVO 注册模拟,并self在一个块内传递。我相信self它被保留在某个地方,但它不应该是,因为它在块之前被削弱了......

使用 Apple 提供的默认 kvo 框架似乎可以解决这个问题。但是,我仍然担心潜在的问题。OCMockito 中的哪些变化导致现在失败?

无论如何,很抱歉给您带来麻烦,非常感谢您。

4

1 回答 1

0

我想说找出答案的最好方法是git bisect在 OCMockito 上运行。这将帮助您准确跟踪哪个提交破坏了您的代码。

这是手册页git bisecthttps ://www.kernel.org/pub/software/scm/git/docs/git-bisect.html

这是官方教程: http: //git-scm.com/book/en/Git-Tools-Debugging-with-Git

在您的情况下,您将执行以下操作:

$ git bisect start
$ git bisect bad v1.0.0
$ git bisect good v0.23

当您知道哪个提交破坏了您的测试时,请尝试准确找出破坏它的提交中的哪些更改。那么请回来告诉我们您发现了什么,以便我们确定是否可以在下一个版本中修复此问题。

如果您有一个暴露此错误的测试项目,我不介意为您进行二等分(至少在我无聊且有时间的情况下不会)。

于 2013-11-04T09:42:43.707 回答