我正在尝试使用 Swift 的@testable
声明将我的类公开给测试目标。但是我收到了这个编译器错误:
Intervals
是包含我要公开的类的模块。我该如何摆脱这个错误?
我正在尝试使用 Swift 的@testable
声明将我的类公开给测试目标。但是我收到了这个编译器错误:
Intervals
是包含我要公开的类的模块。我该如何摆脱这个错误?
在您的主要目标中,您需要将Enable Testability
构建选项设置为是。
根据下面@earnshavian 的评论,这仅应根据苹果发行说明用于调试构建:“启用可测试性构建设置应仅在您的调试配置中使用,因为它禁止依赖于不导出内部符号的优化应用程序或框架” https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html#//apple_ref/doc/uid/TP40001051-CH1-SW326
在我的情况下,我使用自定义构建配置进行测试(称为Test
)以及cocoapods
作为依赖管理器
我必须将以下行添加到我的末尾Podfile
以启用可测试性
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
if config.name == 'Test'
config.build_settings['ENABLE_TESTABILITY'] = 'YES'
end
end
end
end
默认cocoapods
设置ENABLE_TESTABILITY
为YES
仅用于Debug
构建
使用 Bitrise 运行测试时,我开始收到此错误。
与其他用户所说的不同,这不是按Target
基数,或按Schema
基数,而是按基数Configuration
。选择Target
->Build Settings
选项卡 -> 查找-> 在您正在使用testability
的配置上启用它。
请注意,Apple 建议在您用于调试的配置上启用此功能,而不是在 AppStore 上启用。
这可能是因为您的主要目标Enable Testability
设置为NO
. 您应该YES
在调试方案(用于运行测试)中将其设置为。
如果您使用 Carthage,则此问题可能是由使用 导入框架引起的@testable
,因为它们是使用发布方案构建的。
大多数情况下,使用该前缀导入框架是不好的做法,因此您可以避免它。如果你不能,你应该Enable Testability
在框架的发布方案中。https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html#//apple_ref/doc/uid/TP40001051-CH1-SW326
如果你有任何机会
install! 'cocoapods',
generate_multiple_pod_projects: true,
incremental_installation: true
然后,这就是这样做的方法。
# generated_projects only returns results if the we run "pod install --clean-install"
# or install a pod for the first time
installer.generated_projects.each do |project|
project.build_configurations.each do |configuration|
configuration.build_settings["ENABLE_TESTABILITY"] = "YES"
end
end
如果您尝试测试框架:
转到测试目标 -> 构建阶段 -> 创建新的副本文件阶段 -> 选择框架 -> 添加所有递归使用的框架
当我的新 Tests.swift 文件属于错误的目标时,我得到了这个。
我是初学者,我只是不记得所有设置和选项在 Xcode 中的位置。所以当我在回答这类问题时看到“you can set xxx to yyy ...”时,我总是感到沮丧。Xcode中的那些xxx在哪里?那些 yyy 是什么?我们需要一张显示我们如何完成工作的地图,但不需要另一个线索,比如 xxx。看来我们是国家宝藏中的尼古拉斯凯奇!
非常感谢这里提供的所有线索,非常感谢!你真的帮了我。但我在这里有一个具体的答案(实际上来自你):