我正在尝试模拟传递给我的 SUT 的对象。传递时,SUT 将模拟注册为某些属性的观察者。在 SUT dealloc 中,它调用removeObserver
模拟。这在 OCMockito 0.23 上工作得很好,但是当更新到 1.0.0 时,这个测试会使 OCMockito 陷入[HCIsEqual .cxx_destruct]
. 稍微调试一下,引导我到MKTInvocationContainer
方法:
- (void)setInvocationForPotentialStubbing:(NSInvocation *)invocation
其中调用被告知保留其参数。可能是一个保留周期?
此外,我一直在做一些研究,我发现了几个 SO 答案说明NSProxy
和 KVO 之间的不兼容:
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 中的哪些变化导致现在失败?
无论如何,很抱歉给您带来麻烦,非常感谢您。