链接器错误:iPhone单元测试包引用App类

ohh*_*rob 10 iphone xcode linker unit-testing

从已经开发的应用程序开始,我已经执行了iPhone开发指南 - 单元测试应用程序中的说明

我可以成功地在设备上运行的应用程序样式测试中包含和使用我的应用程序类,并将其结果输出到控制台.

如果我添加以下代码行:

STAssertTrue([viewController isKindOfClass:[LoginViewController class]], @"Top view controller is not LoginViewController");
Run Code Online (Sandbox Code Playgroud)

生成以下生成错误:

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
Run Code Online (Sandbox Code Playgroud)

我可以为项目和测试目标提供更多配置信息,但是设置工作文件没有[LoginViewController class]测试源中的行.

没有那一行,我可以引用该类,使用它的属性并成功发送消息.

在尝试以这种方式使用App类时是否需要链接构建设置或捆绑加载选项?或者我应该找到另一种类型的测试来确认对象的类是预期的类?

ohh*_*rob 18

我找到了答案,但我认为必须有一个"更好"的方式?

在单元测试包的构建配置中,您可以指定指向"主机"应用程序的Bundle Loader(BUNDLE_LOADER)设置.

${TARGET_BUILD_DIR}/AppName.app/AppName
Run Code Online (Sandbox Code Playgroud)

单元测试包正在构建为应用程序的单元测试目标(例如AppName Testing)的依赖项,因此我无法比以上更好地解析App可执行文件.

最终结果是将一个工作单元测试注入到测试目标中而没有任何链接器错误.测试运行并按预期访问类.

编辑:捆绑加载器 - 目标配置

配置"托管"测试包的目标不要隐藏它的符号是很重要的.

GCC_SYMBOLS_PRIVATE_EXTERN = NO
Run Code Online (Sandbox Code Playgroud)

又名"默认隐藏的符号".从文档:

启用后,'private extern'除非明确标记为使用'__attribute__((visibility("default")))'代码导出,否则 将声明所有符号 .如果未启用,则除非明确标记为,否则将导出所有符号'private extern'.

有关详细信息,请参阅 http://developer.apple.com/documentation/DeveloperTools/Conceptual/CppRuntimeEnv/Articles/SymbolVisibility.html.