【发布时间】:2014-02-19 02:54:55
【问题描述】:
我遇到了一个奇怪的情况,单元测试的执行与一段代码的正常执行行为不同。
特别是,我正在使用一个名为 JSONModel 的库,当我尝试从 JSON 字符串反序列化对象时,当我逐步执行测试用例时,特别是一行会导致问题:
if ( [[property.type class] isSubclassOfClass:[JSONModel class]] ) ...
如果我在此行之前(或之后)放置断点并执行:
expr [[property.type class] isSubclassOfClass:[JSONModel class]]
...在调试器中,它将\x01 打印为值(即true),但是当我实际执行指令指针时,它的行为就好像它为false,而是进入else 块。同样,将表达式再次输入调试器时,它仍然显示为 true。
我很好奇是否有人以前见过类似的行为并对可能出现的问题提出任何建议。我很确定我没有包含任何不同的定义,除非 Xcode 有不同的内部可可类实现进行测试。
更新:这里有一些更奇怪的证据:我添加了一些NSLog 语句来了解执行是如何看待事物的。如果我登录property.type.superclass,我会得到JSONModel(如预期的那样); 然而如果我登录property.type.superclass == [JSONModel class],我会得到false!
对我来说,这表明单元测试执行所看到的 JSONModel 在某种程度上是我在运行时看到的不同的 JSONModel 类(以及它应该看到的)。但是,我不知道这是怎么发生的。
这可能是由前向类声明或类似的东西引起的吗?
【问题讨论】:
-
比较类的相等性通常是一个坏主意,因为类“家庭”有很多技巧。 (当你使用
po [property.type class]时会发生什么?)(以及使用isSubClassOfClass而不是isKindOfClass的任何原因?) -
isKindOfClass用于比较实例,但是我(或者更确切地说是 JSONModel)拥有的是Class类型的值。因此我不能使用isKindOfClass或isMemberOfClass。至于po [property.type class],我得到Product,这是我正在测试的JSONModel派生类。 -
您将 property.type 的类与 JSONModel 的类进行比较。如果您使用 property.type 与 [property.type class],isKindOfClass 应该可以正常工作。
-
不幸的是,即使使用了 NSClassFromString(),这种疯狂仍在发生......
-
我在单元测试中也看到了这一点。我认为它源于引用被测库的测试项目,并且测试主机应用程序也引用了被测库。尝试 class_getImageName(property.type.superclass) 和 class_getImageName([JSONModel class]) 并检查类的来源。
标签: ios xcode unit-testing xcode5 jsonmodel