看到错误的类,Xcode 5单元测试

时间:2014-01-28 00:57:01

标签: ios xcode unit-testing xcode5 jsonmodel

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

特别是,我正在使用一个名为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类(以及它应该看到的内容)。然而,这是怎么回事我无法弄清楚。

这可能是由前瞻性声明或类似事件造成的吗?

2 个答案:

答案 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即可。