从已经开发的应用开始,我已经执行了 iPhone开发指南 - 单元测试应用
中的说明我可以成功地在设备上运行的应用程序式测试中包含和使用我的应用程序类,并将其结果输出到控制台。
如果我添加以下代码行:
STAssertTrue([viewController isKindOfClass:[LoginViewController class]], @"Top view controller is not LoginViewController");
生成以下构建错误:
Undefined symbols:
"_OBJC_CLASS_$_LoginViewController", referenced from:
__objc_classrefs__DATA@0 in LoginViewTest.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
我可以为项目和测试目标提供更多配置信息,但是设置工作文件在测试源中没有[LoginViewController class]
行。
如果没有该行,我可以引用该类,使用它的属性并成功发送消息。
尝试以这种方式使用App类时是否需要链接构建设置或捆绑加载选项?或者我应该找到另一种类型的测试来确认对象的类是预期的类?
答案 0 :(得分:18)
我找到了答案,但我认为必须采用“更好”的方式?
在单元测试捆绑包的构建配置中,您可以指定指向“主机”应用的捆绑加载器(BUNDLE_LOADER
)设置。
${TARGET_BUILD_DIR}/AppName.app/AppName
单元测试包正在构建为应用程序的单元测试目标(例如,AppName Testing
)的依赖项,因此我无法比以上更好地解析App可执行文件。
最终结果是将一个工作单元测试注入到测试目标中,没有任何链接器错误。测试运行并按预期访问类。
编辑:捆绑加载器 - 目标配置
将“托管”测试包的目标配置为不隐藏它的符号非常重要。
GCC_SYMBOLS_PRIVATE_EXTERN = NO
a.k.a。 “默认情况下隐藏的符号”。来自文档:
启用后,将声明所有符号
'private extern'
除非明确说明 标记为使用导出 代码中'__attribute__((visibility("default")))'
。如果未启用,则为所有符号 导出除非明确标记 为'private extern'
。
答案 1 :(得分:1)
我刚才在这里回答:
iPhone unit testing: Symbols not found when calling custom code
我想其中一个应该作为副本关闭?我没有足够的声誉这么做......
我还关注了Apple的iPhone单元测试应用程序文档,并在尝试对我的一个类进行单元测试时发现了类似于问题中描述的链接错误。
看起来您的单元测试类中引用的任何类都需要添加到该测试目标,因此从测试目标运行。为此,您可以右键单击RootViewController类并单击“获取信息”(Cmd-i快捷方式)。在目标窗格中,确保检查单元测试目标(例如,“LogicTests”,如果您已遵循该文档中的命名)。
现在该类将使用您的测试进行编译,并且应该可用于您的单元测试。要仔细检查,请展开“群组和群组”中的“目标/逻辑测试/编译资源”节点。左侧的文件浏览器。这列出了构建目标时可用的所有类文件,现在应该包括您的单元测试类以及您正在测试的类。
(请注意,在创建新应用程序或测试类时,您需要同样选择所有适当的目标 - 在命名文件时,在“新建文件...”窗口的同一页面上)。
(顺便说一句,我正在使用XCode 3.2.3和OS 4.0)。