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

问题描述 投票:23回答:3

所以我在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)
objective-c cocoa unit-testing xcode4
3个回答
13
投票

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

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


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


4
投票

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.