在使用@testable 时,“模块没有编译用于测试”

我正在尝试使用 Swift 的 @testable声明向测试目标公开我的类。然而,我得到了这个编译器错误:

enter image description here

Intervals是包含我试图公开的类的模块。我如何消除这个错误?

37384 次浏览

在您的主目标中,您需要将 Enable Testability构建选项设置为 Yes。

根据@earnshavian 下面的评论,这应该只在调试构建中使用,正如苹果发布说明: “ Enable Testability build 设置应该只在调试配置中使用,因为它禁止依赖于不从应用程序或框架导出内部符号的优化”https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html#//apple_ref/doc/uid/TP40001051-CH1-SW326

确保您在应用程序方案下正确设置了复选框。您应该为存档构建设定 停止测试目标。

enter image description here

在 Xcode 8之前,我的项目中没有出现这种情况,但是在我升级到 Xcode 8之后,它让我感到困惑。

这里张贴的答案并没有解决我的问题。对我来说,我只是放弃了这些测试,因为它是不需要的。所以不要选择测试按钮:

enter image description here 现在错误已经消失了。

这可能是因为您的主要目标 Enable Testability被设置为 NO。您应该在调试方案(用于运行测试)中将其设置为 YES

如果您使用 Carthage,那么这个问题可能是由导入带有 @testable的框架引起的,因为它们是使用发布方案构建的。

大多数时候,导入带有该前缀的框架是不好的做法,这样您就可以避免这种情况。 如果你不能,你应该在框架的发布方案中使用 Enable Testability。(译者注: 原文为“ norefrer”) https://developer.apple.com/library/content/releasenotes/developertools/rn-xcode/chapters/introduction.html#//apple_ref/doc/uid/tp40001051-ch1-sw326

对于那些只在运行 Xcode Profiler 时才体验到这一点的人来说: 在您的方案管理中将配置文件构建配置切换到启用了可测试性的配置,而且在大多数情况下都会进行调试:

enter image description here

在我的例子中,我使用了一个用于测试的自定义构建配置(称为 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

如果您使用吊舱/迦太基,以上解决方案是可行的。 但是如果你使用的是 iOS 本身的框架,比如联系人,你需要在你主项目目标的“库搜索路径”中为这些框架添加路径。 enter image description here

如果你想测试框架:

转到测试目标-> 构建阶段-> 创建新的副本文件阶段-> 选择框架-> 添加所有递归使用的框架

在使用 Bitrise 运行测试时,我开始出现这个错误。

与其他用户所说的不同,这种 不是Target为基础,或者每 Schema为基础,它 Configuration为基础。 选择 Target-> Build Settings tab-> look for testability-> Enable it on the 正在使用的配置

请注意,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 所有的设置和选项都在哪里。所以当我在回答这类问题时看到“ you can set xxx to yyy...”,我总是感到沮丧。Xcode 的那些东西呢?那些是什么?我们需要一张地图来显示我们如何完成任务,而不是另一条线索,比如 xxx。看来我们是《国家宝藏》里的尼古拉斯 · 凯奇!

非常感谢你提供的所有线索!你真的帮了我大忙。但我在这里有一个具体的答案(实际上是来自你的) :

  1. 选择项目的主要目标
  2. 转到“构建设置”选项卡
  3. 打开“所有”选项
  4. 搜索“构建选项”部分
  5. 将“启用可测试性”设置为“是”
  6. 等待几分钟或重新启动 Xcode (然后错误消失)

当我的新 Tests.swift 文件属于错误的 Target 时,我得到了这个。