我正在尝试模拟一个传递给我的SUT的对象。传递时,SUT将mock注册为某些属性的观察者。在SUT dealloc中,它在mock上调用removeObserver。这在OCMockito 0.23中工作得很好,但当更新到1.0.0时,此测试会使OCMockito陷入[HCIsEqual .cxx_destruct]。稍微调试一下,让我了解一下MKTInvocationContainer方法:
- (void)setInvocationForPotentialStubbing:(NSInvocation *)invocation其中调用被告知保留其参数。可能是一个保留周期?
此外,我一直在做一些研究,我找到了几个关于NSProxy和KVO之间不兼容的答案:
NSProxy and Key Value Observing
https://stackoverflow.com/a/17457155/2824409
然而,我想知道为什么这是在OCMockito 0.23中工作,而不是现在。有什么想法吗?
在我的例子中,解决方案是用一个真实的对象替换mock。这可以很好地工作,但是为一个几乎不使用它的测试套件构建一个完整的对象是很痛苦的。
在任何情况下,如果KVO不支持mock,我相信这应该被记录下来,并得到适当的处理。
编辑
我找到了解决此问题的方法。
我们正在使用一个基于自定义块的KVO基础设施,类似于这里描述的:http://www.mikeash.com/pyblog/key-value-observing-done-right.html。现在,SUT正在注册KVO的模拟,在一个块中传递self。我相信self正在被保留在某个地方,但它不应该被保留,因为它在块之前就被削弱了……
使用Apple提供的默认kvo框架似乎可以解决这个问题。然而,我仍然担心潜在的问题。是什么在OCMockito中发生了变化,导致了现在的失败?
无论如何,很抱歉给您添了麻烦,非常感谢。
发布于 2013-11-04 17:42:44
我会说,最好的方法是在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的测试项目,我不介意为你一分为二(至少在我无聊和有时间的时候不会介意)。
https://stackoverflow.com/questions/19118616
复制相似问题