Swift UI测试在访问枚举rawValue时崩溃

10

Xcode 7.3

开放式雷达:rdar://25456632

我在我的应用程序中使用字符串枚举来定义一些可访问性标识符。例如:

enum AccessibilityIds:String {
    case ButtonFoo
}

我建立了一些UI测试,需要搜索控件。因此,我会做如下操作:

XCUIApplication().buttons[AccessibilityIds.ButtonFoo.rawValue]

XCode认为这是正确的,而且在该行没有显示任何错误。然而,当我编译UI测试时,会出现以下编译器错误:

Undefined symbols for architecture x86_64:
"myApp.AccessibilityIds.rawValue.getter : Swift.String", referenced from:
  (extension in myAppUITests):__ObjC.XCTestCase.fooButton (myApp.AccessibilityIds) -> Swift.Bool in TestCaseExtensions.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

将UI测试目标与单元测试目标进行交叉引用(编译良好并使用枚举),我发现UI测试没有设置测试主机(Test Host)。设置后,UI测试代码现在可以编译,但是测试本身会失败,并显示一个SIGKILL错误:

testFooButton() encountered an error (Lost connection to test manager service. If you believe this error represents a bug, ...

看起来我不能在 UI 测试代码中访问枚举的原始值。有没有其他人遇到过这个问题并成功解决了?


这可能是一个导入问题吗 - 需要将所有文件添加到测试目标中吗? - sschale
我不这么认为。我导入了 @testable import myApp。我也已经成功地从单元测试中访问了这个枚举,并发现在枚举上定义的任何属性或函数都是不可见的。 - drekka
1
已知有一个与单值枚举相关的崩溃Bug,而这恰好是你遇到的情况。尝试给你的枚举再添加另一个值(即使你实际上并不需要它),看看是否能够解决问题。 - matt
@matt - 谢谢,我添加了另一个情况,但它没有起作用。 :-( - drekka
1
有进展吗?在Xcode 8.2上我仍然遇到这个问题。 - Hola Soy Edu Feliz Navidad
显示剩余2条评论
3个回答

1

我在Xcode 11.2.1中仍然看到这个问题。

作为一种解决方法,我已经将枚举的fileprivate副本放置在Tests.swift文件中。 对我来说,这样做没有任何问题或警告。


1
我仍然看到这个问题。我没有复制粘贴代码,而是将定义枚举的文件设置为目标成员,不仅在我的应用程序目标中,还在我的UI测试目标中。 - armcknight
2
其实我刚发现一个问题,@testable 导入不适用于 UI 测试,并且任何共享代码都应该被分解成一个框架,可以链接到应用程序目标和 UI 测试目标中... 我感觉自己以前已经做过这个了,但是忘记了!https://dev59.com/FVsX5IYBdhLWcg3wf_g8?rq=1 - armcknight
我想我一直知道我的解决方法有点太过于代码臃肿了...谢谢你提供的链接! - Mozahler

0
在Xcode 15.0.1中,我通过向项目添加一个新的框架目标(你可以称之为MyEnumsWrapper)来解决类似的问题。你应该将AccessibilityIds移动到这个目标中,然后在所有使用AccessibilityIds的文件中添加import MyEnumsWrapper。所有相关的目标都应该将MyEnumsWrapper作为依赖项。

0
点击源文件,进入右侧面板的“目标成员资格”,然后勾选UITests目标。现在它应该可以正常工作,没有任何错误。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接