【问题标题】:'Module was not compiled for testing' when using @testable使用@testable 时“模块未编译用于测试”
【发布时间】:2015-06-11 17:36:29
【问题描述】:

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

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

【问题讨论】:

    标签: ios swift unit-testing swift5.4


    【解决方案1】:

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

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

    【讨论】:

    • 嗨,我遇到了同样的错误,但没有看到启用可测试性选项,并且正在使用 xcode 7。知道我应该怎么做吗?
    • @user1601259 - 您可以通过选择顶级项目、转到构建设置并在构建选项标题下查看来找到该选项。
    • @hgwhittle - 当我选择顶级项目时,我在构建选项中看到的只是“调试信息格式”和“验证构建产品”。当我在构建选项中选择目标时,我看到“嵌入的内容包含快速代码”。就是这样。当我在构建设置中搜索时,我找不到它。这是因为 xcode 7 吗?
    • 您可能在“构建设置”中选择了“基本”。如果您选择左侧的“全部”,您将看到“启用可测试性”
    • 这对于发布版本应该如何工作,测试将在哪里运行(所以需要@testable)但需要提交到 App Store?如果Enable Testability 仅用于调试版本,那么解决方法是什么?我是否必须提取我的测试代码才能发布?
    【解决方案2】:

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

    默认情况下,cocoapodsENABLE_TESTABILITY 设置为 YES,仅适用于 Debug 构建

    【讨论】:

    • 你救了我的命,问题是我有自定义配置,所以 Cocoapods 没有找到配置“调试”
    【解决方案3】:

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

    【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 这就是我的答案。该方案的测试部分使用了错误的构建配置。
    【解决方案5】:

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

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

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

    【讨论】:

    • 谢谢。这是我的问题的解决方案。
    • 为我工作。谢谢。
    • 很好的答案,谢谢
    【解决方案6】:

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

    【讨论】:

    • 如何避免使用@testable 导入框架?这里有什么好的做法?
    【解决方案7】:

    如果你有任何机会

    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
    

    【讨论】:

    • 对于应用程序的发布版本,是否需要在没有“ENABLE_TESTABILITY”的情况下进行另一次全新安装?随着开发的继续,是否会在 cocoapods 项目上重复安装或不使用此构建设置以允许使用 UITests?
    【解决方案8】:

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

    【讨论】:

      【解决方案9】:

      如果您尝试测试框架:

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

      【讨论】:

        【解决方案10】:

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

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

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

        【讨论】:

          【解决方案11】:

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

          【讨论】:

            【解决方案12】:

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

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

            现在错误已经消失了。

            【讨论】:

            • 如果您不需要测试,最好从项目中删除测试目标,而不是从所有构建中删除它们。
            猜你喜欢
            • 2015-11-07
            • 2021-05-30
            • 2011-09-12
            • 1970-01-01
            • 2015-11-11
            • 2016-09-12
            • 2021-02-10
            • 2017-07-19
            相关资源
            最近更新 更多