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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了isKindOfClass:在单元测试包中返回false negative相关的知识,希望对你有一定的参考价值。

所以我在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)
答案

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

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


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

另一答案

也许这很有帮助,第一个回答:isKindOfClass and NSStringFromClass disagree about UIApplicationDelegate

另一答案

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

以上是关于isKindOfClass:在单元测试包中返回false negative的主要内容,如果未能解决你的问题,请参考以下文章

isKindOfClass 不能按预期工作 IOS 7

golang单元测试

isKindOfClass和isMemberOfClass 的区别

Golang 单元测试与性能测试

软件测试基础单元测验

JUnit 测试私有变量? [复制]