模拟KVO观察者时OCMockito崩溃

时间:2013-10-01 14:17:23

标签: unit-testing key-value-observing ocmockito

我正在尝试模拟传递给我的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的变化让现在失败了吗?

无论如何,对不起,非常感谢你。

1 个答案:

答案 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的测试项目,我不介意为你做一个二等分(至少如果我感到无聊并且有时间的话)。