Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/122.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在Xcode 7.1的UI测试中访问应用程序模块时发生链接器错误_Ios_Xcode_Linker_Xcode Ui Testing_Xcode7.1 - Fatal编程技术网

Ios 在Xcode 7.1的UI测试中访问应用程序模块时发生链接器错误

Ios 在Xcode 7.1的UI测试中访问应用程序模块时发生链接器错误,ios,xcode,linker,xcode-ui-testing,xcode7.1,Ios,Xcode,Linker,Xcode Ui Testing,Xcode7.1,我正试图在我的项目中实现一些UI测试。只要保持简单,一切都会顺利进行:记录测试用例,添加一些断言,然后运行测试。这很好,但是当我尝试从测试内部访问应用程序模块时,链接器会抛出一个错误(请参见下文): 在应用程序源文件中: func foo() { assert(true) } import XCTest @testable import MyApp func testExample() { foo() } 在UI测试中: func foo() { assert(true

我正试图在我的项目中实现一些UI测试。只要保持简单,一切都会顺利进行:记录测试用例,添加一些断言,然后运行测试。这很好,但是当我尝试从测试内部访问应用程序模块时,链接器会抛出一个错误(请参见下文):

在应用程序源文件中:

func foo() {
   assert(true)
}
import XCTest
@testable import MyApp

func testExample() {
    foo()
}
在UI测试中:

func foo() {
   assert(true)
}
import XCTest
@testable import MyApp

func testExample() {
    foo()
}
错误:

func foo() {
   assert(true)
}
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的符号

我在这里报道了类似的问题:
但没有解决办法。在我看来,
@testable
根本无法正常工作。developer.apple.com上的家伙试图通过在设置中添加测试主机和捆绑加载程序来解决问题,但我认为这不是正确的方法。我认为,
@testable
应该让一切都能正常工作,但目前看起来不像。感谢您的帮助

UI测试是应用程序的一个独立模块,因此不会像逻辑测试那样在应用程序内部运行。他们共享代码的唯一方法是编译两个模块之间需要共享的所有应用程序文件。 查看此博客了解如何实现这一目标


在这里还发现了一个雷达文件,

@testable import main module
不适用于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测试目标(除主目标外)

希望苹果能尽快修复它,这样我们就可以更干净地使用它。

@testable import
实际上可能是导致这个错误的原因。把电话线拔出来。UI测试不需要它

“UI测试在应用程序外部以单独的流程运行。您不能从UI测试内部访问应用程序代码-这是设计的一部分。对需要访问应用程序代码和UI测试的测试使用单元测试,以自动化用户交互测试”


请注意,在中的6分钟内,@testable没有被苹果开发者使用

您不应该从UITests访问这样的应用程序模块。。。。但是如果你真的想(请不要),你可以在文件检查器中勾选目标成员船的复选框。我认为,
@testable
在UITests中不起作用,因为您不应该像这样访问原始函数。@JMFR您能详细说明一下为什么不能吗?对我来说,这是一个非常好的场景,尤其是当您有一些静态变量或方法要检查测试时。至于您关于检查目标成员资格的建议,这正是我希望通过使用
@testable
避免的。对于Android UI测试,从测试中访问应用程序代码是完全可以的。对于Android UI测试,您不仅可以访问静态变量,还可以在运行时任意修改应用程序状态。我同意你不应该一直这样做,但这是一个有效的使用场景和一个强大的功能。这个bug在没有@testable的情况下也会发生。正如在其他答案中所指出的,实际上,UITests并不是用来访问原始代码的——这就是单元测试的目的——因此,您是对的,
@testable
在UI测试中不是(或者不应该是)必要的。然而,有时您只需要访问原始代码(例如,在每次测试运行之前删除核心数据信息…)是的,如果他们让模块在不同的情况下说话,那就太好了。@JingLi非常感谢!当我试图将单元测试目标添加到macOS捆绑包时,我也遇到了同样的问题。