【发布时间】:2014-08-12 11:09:59
【问题描述】:
我在测试 XCTestCase 时似乎遇到了这个奇怪的问题。我创建了一个单元测试包,并将我的主应用程序设置为“目标”;现在我可以很好地针对我的核心数据 NSManagedObjects 编写测试,但是如果我在我的应用程序中包含不是 NSManagedObject 的任何其他内容,我会收到链接错误:
架构 x86_64 的未定义符号: “_OBJC_CLASS__$_iCloudListener”,引用自: SLTestToDoWithRepeatInterval.o 中的 objc-class-ref ld:未找到架构 x86_64 的符号 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
这只发生在非 NSManagedObjects 上。并且 iCloudListener 肯定在主应用程序目标的编译源中。问题是,虽然我可以将这个特定的 iCloudListener 类添加到测试目标 -> 构建阶段 -> 编译源列表中,这将使这个特定的链接错误消失,但它引入了新的错误,因为它开始给出链接错误关于 iCLoudListener 类的所有头文件;如果我开始添加这些,它们需要越来越多的文件,以至于我必须将几乎所有的代码都包含到测试目标“编译源”部分中。
我在这里做错了吗?是否存在可能导致 Xcode 忽略非 NSManagedObject 类的设置?
【问题讨论】:
-
是否使单元测试目标的非 NSManagedObject 类成员修复链接错误?当我在单元测试中遇到像你这样的链接错误时,我发现让我的应用程序类成员成为单元测试目标可以消除链接错误。
-
在一定程度上确实如此;但它开始为最初出现问题的类中包含的所有文件提供链接错误。最后,我必须将我的大部分项目文件包含到单元测试目标中。我有 200 多个文件,所以这样做会很乏味,而且好像我错过了一些东西。
-
我唯一可以建议的另一件事是将默认隐藏的符号构建设置设置为 NO。假设这将使您的所有应用程序类可用于功能单元测试的单元测试目标,具有测试主机并托管在您的应用程序内的测试。
-
是的,我从这个答案中偶然发现了同样的事情:stackoverflow.com/a/6624534/145552 现在我的单元测试链接完美!谢谢。
标签: objective-c unit-testing xcode5 xctest xcode-bots