163

我正在尝试使用 Swift 的@testable声明将我的类公开给测试目标。但是我收到了这个编译器错误:

在此处输入图像描述

Intervals是包含我要公开的类的模块。我该如何摆脱这个错误?

4

12 回答 12

271

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

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

于 2015-06-11T21:59:56.227 回答
20

在我的情况下,我使用自定义构建配置进行测试(称为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_TESTABILITYYES仅用于Debug构建

于 2017-08-30T11:47:25.553 回答
16

确保您在应用方案下正确设置了复选框。您应该取消选中存档构建的测试目标。

在此处输入图像描述

于 2016-08-11T13:31:06.987 回答
9

使用 Bitrise 运行测试时,我开始收到此错误。

与其他用户所说的不同,这不是Target基数,或按Schema基数,而是基数Configuration。选择Target->Build Settings选项卡 -> 查找-> 在您正在使用testability的配置上启用它。

请注意,Apple 建议在您用于调试的配置上启用此功能,而不是在 AppStore 上启用。

于 2019-09-26T08:51:32.923 回答
9

对于那些仅在运行 Xcode Profiler 时遇到这种情况的人:将方案管理中的配置文件构建配置切换到启用了可测试性的配置 - 在大多数情况下这将是调试:

在此处输入图像描述

于 2017-08-15T17:01:31.127 回答
5

这可能是因为您的主要目标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

于 2017-08-01T12:15:40.950 回答
2

如果你有任何机会

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
于 2019-10-15T11:46:28.543 回答
0

如果您尝试测试框架:

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

于 2018-10-15T12:30:02.403 回答
0

如果您使用的是 pods/Carthage,上述解决方案很好。但是,如果您使用 iOS 本身的框架“例如联系人”,则需要在主项目目标的“库搜索路径”中添加这些框架的路径。 在此处输入图像描述

于 2017-11-09T07:02:49.640 回答
0

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

于 2022-01-28T16:15:28.850 回答
0

我是初学者,我只是不记得所有设置和选项在 Xcode 中的位置。所以当我在回答这类问题时看到“you can set xxx to yyy ...”时,我总是感到沮丧。Xcode中的那些xxx在哪里?那些 yyy 是什么?我们需要一张显示我们如何完成工作的地图,但不需要另一个线索,比如 xxx。看来我们是国家宝藏中的尼古拉斯凯奇!

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

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

这在 Xcode 8 之前的项目中并没有发生,但是在我升级到 Xcode 8 之后,它让我感到困惑。

此处发布的答案并没有解决我的问题。对我来说,我只是放弃了这些测试,因为它不是必需的。所以取消选中测试按钮:

在此处输入图像描述 现在错误已经消失了。

于 2016-10-13T19:05:37.620 回答