【问题标题】:Can't run tests in a Xcode project that imports another framework无法在导入另一个框架的 Xcode 项目中运行测试
【发布时间】:2017-01-30 15:52:24
【问题描述】:

我正在尝试编写一个开源应用程序来展示如何在 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 目标也有正确的目标依赖设置。有人知道我下一步可以去哪里吗?所有代码在链接到的 repos 中都是开源的。

【问题讨论】:

  • 建议修复 QuizWorld 存储库,以便子模块检查 QuizWorld-API。子模块还应该检查剩余的依赖项(Result、Prelude、ReactiveSwift 等)
  • Casey 是对的,QuizWorld-API 子模块指向你的本地文件夹。
  • 另外我建议设置 .gitignore :)
  • @Casey,谢谢,会的!

标签: ios xcode frameworks


【解决方案1】:

在您的测试目标中,您没有在 Test HostBundle loader 构建设置中设置任何内容。在链接阶段,它基本上无法(不知道从哪里)加载符号。目标依赖项只说明之前应该构建的内容,而“将二进制文件与库链接”对动态框架没有影响。

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

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

后者的文档:

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

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

UPD:在您的第二次提交“第一次测试的设置”中,您已删除这些行,因此您可能只是反向删除这些单独的行。

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

【讨论】:

    猜你喜欢
    • 2013-05-03
    • 1970-01-01
    • 2020-09-14
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多