'模块未编译用于测试'使用@testable时

时间:2015-06-11 17:36:29

标签: ios swift unit-testing swift2

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

enter image description here

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

10 个答案:

答案 0 :(得分:202)

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

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

答案 1 :(得分:11)

解决方案很简单。确保在应用方案下正确设置了复选框。你应该 UNCHECK 你的Archive Build的测试目标。

enter image description here

答案 2 :(得分:8)

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

答案 3 :(得分: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

答案 4 :(得分:4)

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

enter image description here

答案 5 :(得分:1)

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

与其他用户说的不同,此不是(基于Target或<{1}(基于Schema)基础。 选择Configuration-> Target标签->查找Build Settings->在您正在使用的配置上启用它。

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

答案 6 :(得分:0)

如果您使用pods / Carthage,则上述解决方案很好。 但是,如果您使用的是iOS本身的框架,例如。联系人&#39;,您需要在图书馆搜索路径&#39;中添加这些框架的路径。您的主要项目的目标。 enter image description here

答案 7 :(得分:0)

如果您要测试框架:

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

答案 8 :(得分: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 |configuration| do
            configuration.build_settings["ENABLE_TESTABILITY"] = "YES" 
        end
    end

答案 9 :(得分:-2)

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

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

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