Ios Xcode 5单元测试看到错误的类
我遇到了一个奇怪的情况,单元测试的执行行为与代码的正常执行行为不同 特别是,我正在使用一个名为JSONModel的库,当我试图从JSON字符串反序列化一个对象时,当我逐步执行测试用例时,有一行特别会导致问题:Ios Xcode 5单元测试看到错误的类,ios,xcode,unit-testing,xcode5,jsonmodel,Ios,Xcode,Unit Testing,Xcode5,Jsonmodel,我遇到了一个奇怪的情况,单元测试的执行行为与代码的正常执行行为不同 特别是,我正在使用一个名为JSONModel的库,当我试图从JSON字符串反序列化一个对象时,当我逐步执行测试用例时,有一行特别会导致问题: if ( [[property.type class] isSubclassOfClass:[JSONModel class]] ) ... 如果在此行之前(或之后)放置断点并执行: expr [[property.type class] isSubclassOfClass:[JSONM
if ( [[property.type class] isSubclassOfClass:[JSONModel class]] ) ...
如果在此行之前(或之后)放置断点并执行:
expr [[property.type class] isSubclassOfClass:[JSONModel class]]
…在调试器中,它将\x01
打印为值(即true),但是,当我实际步进指令指针时,它的行为就好像它是false一样,而是进入else块。同样,在调试器中输入表达式会再次显示为true,即使仍然如此
我很好奇,以前是否有人见过类似的行为,对可能出现的问题有什么建议。我很确定我没有为任何东西包含不同的定义,除非Xcode有不同的内部cocoa类实现用于测试
更新:这里有一些更奇怪的证据:我添加了一些NSLog
语句来了解执行是如何看待事情的。如果我记录property.type.superclass
我得到JSONModel
返回(如预期);但是,如果我记录property.type.superclass==[JSONModel class]
我会得到false
对我来说,这表明单元测试执行看到的JSONModel在某种程度上是我在运行时看到的另一个JSONModel类(以及它应该看到的)。然而,我不知道这是怎么发生的
这可能是由转发类声明或类似的东西引起的吗?我似乎通过实验发现了一个“解决方案”。事实证明,如果我将
[JSONModel类]
替换为NSClassFromString(@“JSONModel”)
它工作得很顺利
现在我不能说这是为什么,我会把答案告诉任何能解释它的人 我遇到了完全相同的问题,下面是发生的情况 正如对这种行为的预期,类被复制是一个问题。与您一样,
[instance class]
和NSClassFromString
将返回不同的值。然而,该类在所有方面都是相同的:相同的ivar,相同的方法(通过obj运行时检查)。编译、链接和/或运行时未显示任何警告
在我的例子中,测试是关于我的主应用程序(Bar.app)中使用的静态库
基本上,我有3个目标:
libFoo
libFooTests
Bar.app
Bar.app
。
唯一的附加链接器标志是-ObjC
现在,Bar.app
正在链接libFoo
。
原来,libFooTests
也在链接libFoo
。
在测试主机(Bar.app
)中注入libFooTests
时,符号被复制,但没有向我显示任何警告。这就是这个特殊类被复制的原因
只需将
libFoo
从libFooTests
中要链接的库列表中删除,就可以做到这一点。通常比较类是否相等是一个坏主意,因为类“族”中有很多技巧。(当您使用po[property.type class]
时会发生什么情况?)(使用IsubClassOfClass
而不是isKindOfClass
?)的任何原因都是为了比较实例,isKindOfClass
是为了比较实例,而我(或者更确切地说是JSONModel)拥有的是class
类型的值。因此,我不能使用isKindOfClass
或isMemberOfClass
。至于po[property.type class]
,我得到了Product
,这是我正在测试的JSONModel派生类。您正在比较property.type的类和JSONModel的类。如果使用property.type vs[property.type class],isKindOfClass应该可以正常工作。不幸的是,即使使用了NSClassFromString(),这种疯狂仍然在发生……我在单元测试中也看到了这一点。我认为它源于引用被测库的测试项目和引用被测库的测试主机应用程序。尝试使用class_getImageName(property.type.superclass)和class_getImageName([JSONModel class])并检查类的源代码。如果除了主代码之外,库模块中还存在JSONModel,那么您引用的版本可能来自库模块,比较class==class将失败。我认为,但这都是一个快乐的大项目。没有外部库。也将要测试的类添加到单元测试目标。