我遇到了一个奇怪的情况,即单元测试的执行行为与正常执行一段代码的行为不同。
特别是,我正在使用一个名为JSONModel的库,当我尝试从JSON字符串反序列化一个对象时,特别是当我单步执行测试用例时,一行会导致问题:
if ( [[property.type class] isSubclassOfClass:[JSONModel class]] ) ...
如果我在此行之前(或之后)放置一个断点并执行:
expr [[property.type class] isSubclassOfClass:[JSONModel class]]
...在调试器中,它打印\x01
作为值(即为true),但是当我实际执行指令指针时,它表现得好像是假的,而是进入else块。再次,将表达式再次输入到调试器中,即使它仍然显示为真。
我很好奇以前是否有人见过类似的行为,并对可能出现的问题有任何建议。我非常确定我没有包含任何定义,除非Xcode有不同的内部可可类实现进行测试。
更新:以下是一些更奇怪的证据:我添加了一些NSLog
语句来了解执行操作的内容。如果我记录property.type.superclass
,我会回复JSONModel
(如预期的那样); 然而如果我记录property.type.superclass == [JSONModel class]
,我会false
!
对我而言,这表明单元测试执行所看到的JSONModel在某种程度上是我在运行时看到的不同的JSONModel类(以及它应该看到的内容)。然而,这是怎么回事我无法弄清楚。
这可能是由前瞻性声明或类似事件造成的吗?
答案 0 :(得分:3)
好吧,我似乎通过实验发现了一个“解决方案”。事实证明,如果我将[JSONModel class]
替换为NSClassFromString(@"JSONModel")
,它可以游动地运作!
现在为什么这是我不能说的,并且会给予任何可以解释它的答案!
答案 1 :(得分: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
即可。