【问题标题】:Xcode 5 unit test seeing wrong classXcode 5 单元测试看到错误的类
【发布时间】: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 类型的值。因此我不能使用isKindOfClassisMemberOfClass。至于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


【解决方案1】:

我遇到了完全相同的问题,这是发生了什么。

正如预期的这种行为,这是复制类的问题。与您一样,[instance class]NSClassFromString 将返回不同的值。但是,该类在所有方面都是相同的:相同的 ivar,相同的方法(使用 obj 运行时检查)。在编译、链接和/或运行时没有显示警告

就我而言,测试是关于我的主应用程序 (Bar.app) 中使用的静态库。

基本上,我有 3 个目标:

  • libFoo
  • libFooTests
  • Bar.app

测试是在设备上执行的,而不是在模拟器上执行的。因此,它们需要是逻辑测试,而不是单元测试,并且必须加载到应用程序中。捆绑加载器是我的主要应用程序,Bar.app。 只有额外的链接器标志是-ObjC

现在,Bar.app 正在链接 libFoo。 事实证明,libFooTests 也在链接libFoo。 在测试主机 (Bar.app) 中注入 libFooTests 时,符号重复,但没有向我显示警告。这就是这个特定类被复制的方式。

只需从要链接到 libFooTests 的库列表中删除 libFoo 就可以了。

【讨论】:

    【解决方案2】:

    嗯,我似乎通过实验发现了一个“解决方案”。事实证明,如果我将[JSONModel class] 替换为NSClassFromString(@"JSONModel"),它就可以正常工作!

    现在为什么这是我不能说的,并且会给谁能解释它的答案!

    【讨论】:

    • 如果 JSONModel 除了主代码之外还存在于库模块中,那么您引用的版本可能来自库模块,比较 class== 类将失败。
    • 我考虑过这一点,但这一切都在一个快乐的大项目中。没有外部库。
    • 将您正在测试的类也添加到单元测试目标中。
    猜你喜欢
    • 1970-01-01
    • 2013-09-27
    • 2013-10-02
    • 2018-06-07
    • 2018-10-03
    • 2011-09-10
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    相关资源
    最近更新 更多