isKindOfClass:在单元测试包中返回false negative

时间:2011-04-22 12:14:07

标签: objective-c cocoa unit-testing xcode4

所以我在UISplitViewController的详细视图中有一个MyViewController实例。我正在运行单元测试,以查看详细视图是否包含正确的视图类型。

我使用以下方法测试单元测试中的控制器类型:

[controller isKindOfClass:[MyViewController class]];

但是,isKindOfClass方法始终返回NO

当我在调试器中输入对象时,我得到以下内容:

(gdb) po controller
<MyViewController: 0xb31c4d0>

我也尝试了isMemberOfClass:方法,它产生了相同的结果。谁能解释为什么会这样呢?

编辑:因此,在阅读了Nick Weaver发布的文章之后,我意识到我将我的应用程序的源文件包含在测试包的编译源构建阶段中。这在日志中也表示类似于以下内容:

Class MyViewController is implemented in both /Users/jdoe/Library/Application Support/iPhone Simulator/4.3.2/Applications/670A077A-BAD8-4FA6-945A-851F33114CF5/MyApp.app/MyApp and /Users/jdoe/Library/Developer/Xcode/DerivedData/MyApp-drxyfejeattjwgantzesgensnlnx/Build/Products/Debug-iphonesimulator/MyAppTests.octest/MyAppTests. One of the two will be used. Which one is undefined.

但是,当我从测试包的编译源构建阶段中删除源文件时,我会收到如下所示的链接器错误:

Undefined symbols for architecture i386:
"_OBJC_CLASS_$_MyViewController", referenced from:
  objc-class-ref in _MyViewControllerTests.o
 (maybe you meant: _OBJC_CLASS_$__MyViewControllerTests)

3 个答案:

答案 0 :(得分:13)

正如我在问题中所提到的,我意识到我在测试包的编译源构建阶段错误地包含了应用程序的源文件。从此构建阶段删除源文件后,我通过将“默认构建隐藏的符号”设置更改为“否”来解决缺少符号的链接器错误

Xcode build settings

这解决了链接器错误,意味着我不再包含重复的源文件


注意:另外,请务必在Xcode的Info选项卡中设置测试目标的“主机目标”,以便从那里提取编译源

答案 1 :(得分:4)

答案 2 :(得分:0)

我的某个应用程序存在同样的问题,通过从测试目标中删除.m文件来修复它。在您的情况下,从测试目标中删除MyViewController.m将解决您的问题。 打开您的.m文件。转到Xcode中的右侧导航器,并从目标成员资格中删除测试目标的勾选。 问题是编译器编译两个MyViewController.m(一个用于app一个用于测试),而.class可能返回不同的对象。