无法在导入另一个框架的XCode项目中运行测试

时间:2017-01-30 15:52:25

标签: ios xcode frameworks

我正在尝试编写一个开源应用程序来展示如何在Swift中编写客户端+服务器代码。 源代码位于:https://github.com/haaakon/QuizWorld(简称QW)

该应用正在使用位于此处的框架:https://github.com/haaakon/QuizWorld-API(QWAPI)来访问API。我已将QWAAPI作为项目导入到QW应用程序中,它在模拟器中运行良好,但在运行测试时,由于此错误而无法编译:

Undefined symbols for architecture x86_64:
"QuizWorld.QuestionViewModel.__allocating_init () -> QuizWorld.QuestionViewModel", referenced from

这只是测试中的一行代码:

let a = QuestionViewModel()

这意味着测试目标无法正确获取导入的模块。导入为:

@testable import QuizWorld
@testable import QuizWorldAPI

import Prelude
import ReactiveSwift
import ReactiveExtensions
import Result

我已尝试添加大量不同的导入,即使对于API框架中使用的框架,但似乎没有任何解决方法。 QW-Tests目标还具有正确的目标依赖关系设置。任何人都有一个线索,我可以在这附近吗?所有代码都是链接到。的回购链中的开源代码。

1 个答案:

答案 0 :(得分:6)

在测试目标中,Test HostBundle loader构建设置中未设置任何内容。在链接阶段,它基本上失败(不知道从哪里开始)加载符号。目标依赖项仅表示之前应该构建的内容,而“使用库链接二进制文件”对动态框架没有影响。

在测试目标中设置以下构建设置:

Test Host: $(BUILT_PRODUCTS_DIR)/QuizWorld.app/QuizWorld
Bundle Loader: $(TEST_HOST)

后者的文档:

  

指定将加载要链接的包输出文件的可执行文件。捆绑包中未定义的符号将根据指定的可执行文件进行检查,就像它是捆绑包的动态库之一一样。

我在你的项目上试过这个并且它有效。

UPD:在你的第二次提交“第一次测试的设置”中你已经删除了这些行,所以你可能只是反向删除那些单独的行。

UPD2:关于您的一般项目设置。尝试在真实设备上运行您的应用程序,使用此设置,它将无法找到QWAPI项目中包含的第三方框架,因为它们不会自动复制。您需要设置“复制框架”构建阶段,以确保将动态框架复制到应用程序包中。