【问题标题】:Core Data classes not generated for test target未为测试目标生成核心数据类
【发布时间】:2017-08-25 16:57:39
【问题描述】:

我使用 Core Data 自动生成的类。除了测试目标之外,我的项目还有 3 个目标。对于每个目标,都正确生成了核心数据类,我通过检查派生数据文件夹进行了验证。但是,尽管在 Core Data 模型文件中勾选了测试目标,但不会为测试目标生成类。当我尝试引用测试目标中的核心数据类之一时,这会导致“未声明的标识符”和“使用未声明的类型”错误。请问如何解决这个问题?

【问题讨论】:

    标签: ios objective-c unit-testing core-data


    【解决方案1】:

    您不需要为每个测试目标生成额外的类 - 您的导入过程应该导入所有内容,并且不需要将任何文件添加到其他目标。

    声明@testable import MyProject 应该会处理好所有事情。

    在目标 C 中

    @import MyProject;
    

    【讨论】:

    • 更新了 Objective C 版本的 import。
    • @DaveWeston:'@import' 用于框架,而不是用于目标。如果 MyProject 是目标,则 '@import MyProject;'将导致错误“找不到模块 MyProject”。 sschale 链接到的问题来自 2014 年,答案讨论了 Xcode 5 的构建设置。
    【解决方案2】:

    在 Xcode 9.1 中,尝试将您的 .xcdatamodel 也添加到测试目标中。所有自动生成的类也将被导入。

    【讨论】:

    • 请注意这一点,因为虽然它允许编译测试目标,但您最终会得到模型类型的重复定义。对我来说,它在获取实体时会导致运行时错误,因为AppTarget.SomeModelClassTestTarget.SomeModelClass 的类型不同。
    【解决方案3】:

    这是由于当前 Xcode (8.3.1) 中的一个错误导致尽管项目编译成功,但无法在全局路径上找到自动生成的 NSManagedObject 类(codegen 设置为“类定义”)。解决这个问题的唯一方法是通过将每个实体的 codegen 设置为“Manual/None”来手动生成 NSManagedObject 类。

    【讨论】:

      【解决方案4】:

      我注意到在 Xcode 9.1 中,Data Model Inspector 有一个下拉菜单供模块使用。使用类定义 Codegen 选择“当前产品模块”,并将模型包含在您的测试目标中,编译时不会出错。据我所知,pieSquared 注意到的问题似乎不是问题,但我的测试还不够详尽。不过,这可能是值得尝试的。

      【讨论】:

        【解决方案5】:

        选择测试目标,导航到 Build Settings 并搜索设置“Header Search Paths”

        然后添加以下条目:

        $CONFIGURATION_TEMP_DIR/{Project Target Name}.build/DerivedSources/CoreDataGenerated/{Project Name}
        

        将大括号分别替换为您的主要目标名称(不是测试目标)和您的项目名称。

        Xcode 现在应该能够在构建测试目标时找到生成的源文件。

        【讨论】:

          【解决方案6】:

          自从 Xcode 9.4 或之后的版本以来,我一直在努力解决这个问题。错误总是一样的:

          测试因构建失败而取消。 'MyEntity+CoreDataProperties.h' 文件未找到

          我已经提交了错误报告 (45802900),但我也得到了 Apple 支持的参与,我们最终一起找到了解决方案。 .其实有两种解决方案。

          解决方案 1:设置测试目标的 Header Search Paths 构建设置

          在我看来,最优雅的解决方案是设置 test 目标的 Header Search Paths 构建设置。技术支持的 Ziqiao Chen 找到了正确的路径,而我提供了构建变量。对于只有一个数据模型的项目,其名称与项目名称相同(默认),Header Search Path 可能是:

          $(TARGET_TEMP_DIR)/../$(PROJECT_NAME).build/DerivedSources/CoreDataGenerated/$(PROJECT_NAME)

          确保路径设置为“非递归”。

          对于具有多个数据模型的项目,应在每个数据模型的 Header Search Paths 中添加一个非递归路径:

          $(TARGET_TEMP_DIR)/../$(PROJECT_NAME).build/DerivedSources/CoreDataGenerated/dataModel1 $(TARGET_TEMP_DIR)/../$(PROJECT_NAME).build/DerivedSources/CoreDataGenerated/data_model_B

          解决方案 2:将数据模型添加到测试目标

          Ziqiao Chen 提出的另一个解决方案,我在 SO 上也读到过,就是将数据模型添加到测试目标。然而,根据我的经验,这只适用于单个数据模型。正如 Ziqiao Chen 所指出的,Xcode 应该为测试目标生成与主目标完全相同的文件。

          我的经验是,在更复杂的项目(多个目标、多个数据模型)中,可能会发生各种链接器错误,从有关重复的投诉到上述“测试取消”错误。然而,对于简单的项目,这是一个快速简单的解决方案。

          【讨论】:

            【解决方案7】:

            对于 Xcode 11.5: 如果 Codegen 属性是 class Definition,并且您没有收到有关您在 xcdatamodel 中创建的实体的建议。尝试退出 Xcode 并再次重新打开您的项目。这个对我有用。此答案仅在您没有收到建议但未生成文件时请尝试上述任何答案。

            【讨论】:

              猜你喜欢
              • 2012-01-09
              • 2011-06-24
              • 1970-01-01
              • 2012-05-12
              • 1970-01-01
              • 1970-01-01
              • 2012-05-09
              • 1970-01-01
              • 2020-02-06
              相关资源
              最近更新 更多