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

ndu*_*sis 24 cocoa unit-testing objective-c xcode4

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

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

[controller isKindOfClass:[MyViewController class]];
Run Code Online (Sandbox Code Playgroud)

但是,isKindOfClass方法始终返回NO

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

(gdb) po controller
<MyViewController: 0xb31c4d0>
Run Code Online (Sandbox Code Playgroud)

我也尝试了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.
Run Code Online (Sandbox Code Playgroud)

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

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

ndu*_*sis 13

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

Xcode构建设置

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


注意:另外,请务必在InfoXcode 的选项卡中为测试目标设置"Host Target",以便从那里提取编译源