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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用@testable时,“模块未编译用于测试”相关的知识,希望对你有一定的参考价值。

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

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

答案

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

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

另一答案

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

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仅为ENABLE_TESTABILITY版本将YES设置为Debug

另一答案

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

如果您使用Carthage,可以通过使用@testable导入框架来解决此问题,因为它们是使用发布方案构建的。

大多数情况下导入具有该前缀的框架是不好的做法,因此您可以避免它。如果你不能,你应该在框架的发布方案中使用Enable Testabilityhttps://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

另一答案

如果你使用豆荚/迦太基,上面的解决方案是好的。但是,如果您使用的是ios本身的框架,例如联系人',您需要在主项目目标的“库搜索路径”中添加这些框架的路径。 enter image description here

另一答案

如果您尝试测试框架:

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

另一答案

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

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

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

以上是关于使用@testable时,“模块未编译用于测试”的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 @testable 导入无法在 xcode 单元测试中加载模块

做个人吧,写点Testable代码,好吗!

做个人吧,写点Testable代码,好吗!

做个人吧,写点Testable代码,好吗!

做个人吧,写点Testable代码,好吗!

做个人吧,写点Testable代码,好吗!