Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Xcode 5单元测试看到错误的类_Ios_Xcode_Unit Testing_Xcode5_Jsonmodel - Fatal编程技术网

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

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

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

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

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将失败。我认为,但这都是一个快乐的大项目。没有外部库。也将要测试的类添加到单元测试目标。