我正在尝试在我的项目中实现一些UI测试。只要我保持简单,一切都很顺利:记录测试用例,添加一些断言,然后运行测试。这很好,但是当我尝试从我的测试中访问应用程序模块时,链接器会抛出一个错误(见下文):
在应用程序源文件中:
func foo() {
assert(true)
}
在UI测试中:
import XCTest
@testable import MyApp
func testExample() {
foo()
}
错误:
架构i386的未定义符号:“MyApp.foo() - >()”, 引自: MyAppUITests.MyAppUITests.testExample(MyAppUITests.MyAppUITests)() - > MyAppUITests.o中的()ld: 在架构i386 clang中找不到符号:错误:链接器命令 退出代码1失败(使用-v查看调用)
架构x86_64的未定义符号:“MyApp.foo() - >()”, 引自: MyAppUITests.MyAppUITests.testExample(MyAppUITests.MyAppUITests)() - > MyAppUITests.o中的()ld: 找不到架构x86_64的符号
我在这里报道了类似的问题:
https://forums.developer.apple.com/thread/20609
但没有解决方案。在我看来,@testable
根本无法正常工作。 developer.apple.com 上的人试图通过在设置中添加测试主机和捆绑加载器来解决此问题,但我不认为这是正确的方法。我认为@testable
应该让一切正常,而且现在看起来并不像。任何帮助表示赞赏!
答案 0 :(得分:44)
@testable import MainModule
无法为UI测试工作,但它可以使代码完成(可能会让您觉得它有效)。它目前仅用于单元测试。它会导致构建失败,例如:
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
解决方法是将源代码文件添加到UI测试目标,然后它将开箱即用(即使没有@testable import
)。
文件检查器 - > 目标会员 - >检查 UI测试目标(除了主要目标)
希望Apple能尽快修复它,以便我们能够更清晰地使用它。
答案 1 :(得分:4)
UI测试是与应用程序分开的模块,因此不会像在逻辑测试中那样在您的应用程序中运行。他们共享代码的唯一方法是编译您需要在两个模块之间共享的所有应用程序文件。 请查看此博客,了解如何实现这一目标,https://www.bignerdranch.com/blog/ui-testing-in-xcode-7-part-1-ui-testing-gotchas/
答案 2 :(得分:1)
@testable import <yourApp>
实际上可能导致此错误。拿出线就行了。 UI测试不需要它。
“UI测试在一个单独的过程中在您的应用程序之外运行。您无法从UI测试中访问应用程序代码 - 这有意成为设计的一部分。对需要访问应用程序代码和UI测试的测试使用单元测试自动化用户交互测试“
请注意,6分钟后,Apple Developers不会使用@testable。 https://www.youtube.com/watch?v=7zMGf-0OnoU&t=1316s