使用@testable时,“未编译模块进行测试”


146

我正在尝试使用Swift 2的新@testable声明将我的类暴露给测试目标。但是我收到此编译器错误:

在此处输入图片说明

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

Answers:


238

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

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


嗨,我遇到了同样的错误,但是没有看到启用可测试性选项,并且正在使用xcode7。我知道该怎么办?
user1601259

2
@ user1601259-您可以通过选择顶层项目,转到“构建设置”,然后在“构建选项”标题下查看来找到该选项。
hgwhittle

@hgwhittle-选择顶层项目时,在构建选项中看到的只是“调试信息格式”和“验证构建产品”。当我在构建选项中选择目标时,我看到“嵌入的内容包含快速代码”。而已。当我在构建设置中搜索时,找不到它。这是因为xcode 7吗?
user1601259 2015年

1
您可能已经在“构建设置”中选择了“基本”。如果您在左侧选择“全部”,则会看到“启用可测试性”
阵列

1
这对于发布版本(在需要运行测试(需要@testable)但需要提交到App Store的版本)中应该如何工作?如果Enable Testability仅用于调试版本,解决方法是什么?我是否必须提取测试代码才能发布?
timgcarlson

15

就我而言,我使用了一个自定义的构建配置进行测试(称为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构建


13

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

在此处输入图片说明


2
有关更多信息,请
参见

8

对于只在运行Xcode Profiler时才遇到此问题的用户:将方案管理中的配置文件构建配置切换为启用了可测试性的配置-在大多数情况下可以进行调试:

在此处输入图片说明


4

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


2
如何避免使用@testable导入框架?这是什么好习惯?
乔纳森·卡布雷拉

3

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

不像其他的用户说,这是不是Target基础,或每Schema基础,它Configuration基础。选择Target-> Build Settings选项卡->查找testability->在您使用配置上启用它。

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


0

如果您使用吊舱/迦太基,上述解决方案很好。但是,如果您使用的是iOS本身的“联系人”框架,则需要在主项目目标的“库搜索路径”中为这些框架添加路径。 在此处输入图片说明


0

如果您尝试测试框架:

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


0

如果有机会

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

-3

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

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

在此处输入图片说明 现在错误已经排除。


1
如果您不需要测试,最好从项目中删除测试目标,而不是从所有版本中删除它们。
乔纳森·卡布雷拉
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.