1

我遇到了一个奇怪的情况,单元测试的执行与一段代码的正常执行不同。

特别是,我正在使用一个名为 JSONModel 的库,当我尝试从 JSON 字符串反序列化对象时,当我逐步执行测试用例时,特别是一行会导致问题:

if ( [[property.type class] isSubclassOfClass:[JSONModel class]] ) ...

如果我在此行之前(或之后)放置断点并执行:

expr [[property.type class] isSubclassOfClass:[JSONModel class]]

...在调试器中,它打印\x01为值(即真),但是当我实际执行指令指针时,它的行为就好像它是假的,而是进入 else 块。同样,在调试器中输入表达式再次显示它为真,即使仍然如此。

我很好奇是否有人以前见过类似的行为并对可能出现的问题有任何建议。我很确定我没有包含任何不同的定义,除非 Xcode 有不同的内部可可类实现进行测试。

更新:这里有一些更奇怪的证据:我添加了一些NSLog语句来了解执行是如何看待事物的。如果我登录property.type.superclass,我会JSONModel回来(如预期的那样);但是,如果我登录property.type.superclass == [JSONModel class],我会得到false

对我来说,这表明单元测试执行所看到的 JSONModel 在某种程度上是我在运行时看到的不同的 JSONModel 类(以及它应该看到的)。但是,这是如何发生的,我无法弄清楚。

这可能是由前向类声明或类似的东西引起的吗?

4

2 回答 2

3

好吧,我似乎通过实验发现了一个“解决方案”。事实证明,如果我用它替换[JSONModel class]NSClassFromString(@"JSONModel")可以正常工作!

现在为什么会这样,我不能说,并且会给谁能解释它的答案!

于 2014-01-28T02:15:48.657 回答
0

我有完全相同的问题,这就是发生的事情。

正如对这种行为所预期的那样,复制类是一个问题。和你一样[instance class]NSClassFromString会返回不同的值。但是,该类在所有方面都是相同的:相同的 ivar,相同的方法(使用 obj 运行时检查)。在编译、链接和/或运行时未显示警告

就我而言,测试是关于我的主应用程序(Bar.app)中使用的静态库。

基本上,我有 3 个目标:

  • libFoo
  • libFooTests
  • Bar.app

测试是在设备上执行的,而不是在模拟器上执行的。因此,它们需要是逻辑测试,而不是单元测试,并且必须加载到应用程序中。捆绑加载器是我的主要应用程序,Bar.app. 只有附加的链接器标志是-ObjC

现在,Bar.app正在链接libFoo. 事实证明,libFooTests也正在链接libFoo. libFooTests在测试主机 ( ) 中注入时Bar.app,符号重复,但没有向我显示警告。这就是这个特定类被复制的方式。

只需libFoo从要链接的库列表中删除就可以libFooTests了。

于 2015-03-18T20:14:35.600 回答