我正在尝试模拟传递给我的SUT的对象。传递时,SUT将mock注册为某些属性的观察者。在SUT dealloc中,它在模拟上调用removeObserver
。这与OCMockito 0.23工作得很好,但是当更新到1.0.0时,此测试使OCMockito陷入[HCIsEqual .cxx_destruct]
。调试一下,引导我MKTInvocationContainer
方法:
- (void)setInvocationForPotentialStubbing:(NSInvocation *)invocation
,其中告知调用保留其参数。可能是保留周期吗?
此外,我一直在做一些研究,我发现了几个SO答案,说明NSProxy
和KVO之间的不兼容性:
NSProxy and Key Value Observing
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的变化让现在失败了吗?
无论如何,对不起,非常感谢你。
答案 0 :(得分:0)
我想说最好的方法是在OCMockito上运行git bisect
。这将帮助您准确追踪哪些提交破坏了您的代码。
以下是git bisect
的手册页:
https://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
当您知道哪个提交中断了您的测试时,请尝试确定提交中确实发生了哪些更改。然后请回来告诉我们您发现了什么,以便我们可以确定是否可以在下一个版本中修复此问题。
如果你有一个暴露这个bug的测试项目,我不介意为你做一个二等分(至少如果我感到无聊并且有时间的话)。