'Module was not compiled for testing' 使用@testable 时
'Module was not compiled for testing' when using @testable
我正在尝试使用 Swift 的 @testable
声明将我的 类 暴露给测试目标。但是我收到了这个编译器错误:
Intervals
是包含我要公开的 类 的模块。我如何摆脱这个错误?
在您的主要目标中,您需要将 Enable Testability
构建选项设置为是。
根据下面@earnshavian 的评论,根据苹果发行说明,这只能用于调试版本:"The Enable Testability build setting should be used only in your Debug configuration, because it prohibits optimizations that depend on not exporting internal symbols from the app or framework" https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html#//apple_ref/doc/uid/TP40001051-CH1-SW326
确保您在应用方案下正确设置了复选框。您应该取消选中 存档构建的测试目标。
我在Xcode 8之前的项目中没有出现这种情况,但是在我升级到Xcode 8之后,这让我感到困惑。
这里发布的答案没有解决我的问题。对我来说,我只是放弃了这些测试,因为它不需要。所以取消选中测试按钮:
现在错误消失了。
这可能是因为您的主要目标 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
对于那些仅在 运行 Xcode Profiler 上遇到此问题的人:将方案管理中的配置文件构建配置切换到启用了可测试性的配置 - 这在大多数情况下都是调试的案例:
在我的例子中,我使用自定义构建配置进行测试(称为 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
仅针对 Debug
构建
将 ENABLE_TESTABILITY
设置为 YES
如果您使用 pods/Carthage,上述解决方案很好。
但是,如果您使用 iOS 本身 'e.g. Contacts' 的框架,则需要在主项目目标的 'Library Search Paths' 中添加这些框架的路径。
如果您尝试测试框架:
转到测试目标 -> 构建阶段 -> 创建新的复制文件阶段 -> 选择框架 -> 添加所有递归使用的框架
我在 运行 使用 Bitrise 进行测试时开始遇到此错误。
与其他用户所说的不同,这个 不是 per Target
basis,或者 per Schema
basis,它 is 每 Configuration
基础。
Select Target
-> Build Settings
选项卡 -> 查找 testability
-> 在您正在使用的配置 上启用它。
请注意,Apple 建议在您用于调试的配置上启用此功能,而不是在 AppStore 上启用。
如果你有任何机会
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
我是初学者,我只是不记得 Xcode 中所有设置和选项的位置。所以看到这类问题的回答中“你可以将xxx设置为yyy ...”时,我总是感到很沮丧。 Xcode 中的那些 xxx 在哪里?那些yyy是什么?我们需要一张显示我们如何完成工作的地图,而不是其他线索,例如 xxx。看来我们是国家宝藏中的尼古拉斯·凯奇!
非常感谢这里提供的所有线索!你真的帮了我。但我在这里有一个具体的答案(实际上来自你):
- Select你项目的主要目标
- 转到“构建设置”选项卡
- 开启“全部”选项
- 搜索“构建选项”部分
- 将“启用可测试性”设置为“是”
- 等待几分钟或重启Xcode(然后错误消失)
当我的新 Tests.swift 文件属于错误的目标时,我得到了这个。
我正在尝试使用 Swift 的 @testable
声明将我的 类 暴露给测试目标。但是我收到了这个编译器错误:
Intervals
是包含我要公开的 类 的模块。我如何摆脱这个错误?
在您的主要目标中,您需要将 Enable Testability
构建选项设置为是。
根据下面@earnshavian 的评论,根据苹果发行说明,这只能用于调试版本:"The Enable Testability build setting should be used only in your Debug configuration, because it prohibits optimizations that depend on not exporting internal symbols from the app or framework" https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html#//apple_ref/doc/uid/TP40001051-CH1-SW326
确保您在应用方案下正确设置了复选框。您应该取消选中 存档构建的测试目标。
我在Xcode 8之前的项目中没有出现这种情况,但是在我升级到Xcode 8之后,这让我感到困惑。
这里发布的答案没有解决我的问题。对我来说,我只是放弃了这些测试,因为它不需要。所以取消选中测试按钮:
这可能是因为您的主要目标 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
对于那些仅在 运行 Xcode Profiler 上遇到此问题的人:将方案管理中的配置文件构建配置切换到启用了可测试性的配置 - 这在大多数情况下都是调试的案例:
在我的例子中,我使用自定义构建配置进行测试(称为 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
仅针对 Debug
构建
ENABLE_TESTABILITY
设置为 YES
如果您使用 pods/Carthage,上述解决方案很好。
但是,如果您使用 iOS 本身 'e.g. Contacts' 的框架,则需要在主项目目标的 'Library Search Paths' 中添加这些框架的路径。
如果您尝试测试框架:
转到测试目标 -> 构建阶段 -> 创建新的复制文件阶段 -> 选择框架 -> 添加所有递归使用的框架
我在 运行 使用 Bitrise 进行测试时开始遇到此错误。
与其他用户所说的不同,这个 不是 per Target
basis,或者 per Schema
basis,它 is 每 Configuration
基础。
Select Target
-> Build Settings
选项卡 -> 查找 testability
-> 在您正在使用的配置 上启用它。
请注意,Apple 建议在您用于调试的配置上启用此功能,而不是在 AppStore 上启用。
如果你有任何机会
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
我是初学者,我只是不记得 Xcode 中所有设置和选项的位置。所以看到这类问题的回答中“你可以将xxx设置为yyy ...”时,我总是感到很沮丧。 Xcode 中的那些 xxx 在哪里?那些yyy是什么?我们需要一张显示我们如何完成工作的地图,而不是其他线索,例如 xxx。看来我们是国家宝藏中的尼古拉斯·凯奇!
非常感谢这里提供的所有线索!你真的帮了我。但我在这里有一个具体的答案(实际上来自你):
- Select你项目的主要目标
- 转到“构建设置”选项卡
- 开启“全部”选项
- 搜索“构建选项”部分
- 将“启用可测试性”设置为“是”
- 等待几分钟或重启Xcode(然后错误消失)
当我的新 Tests.swift 文件属于错误的目标时,我得到了这个。