未为测试目标生成核心数据类

时间:2017-03-31 12:11:38

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

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

7 个答案:

答案 0 :(得分:4)

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

声明@testable import MyProject应该照顾好一切。

在目标C

@import MyProject;

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

我注意到在Xcode 9.1中,数据模型检查器有一个下拉模块供我们使用。选择“当前产品模块”'使用类定义Codegen,并在测试目标中包含模型,编译时没有错误。据我所知,pieSquared注意到的问题似乎并不是一个问题,但我的测试还没有详尽无遗。尽管如此,这可能是值得尝试的。

答案 4 :(得分:1)

自Xcode 9.4以来,我一直在努力解决这个问题。错误始终相同:

  

由于构建失败,测试被取消。   找不到“ MyEntity + CoreDataProperties.h”文件

我已经提交了一个错误报告(45802900),但是我也得到了Apple支持的支持,我们终于找到了解决方案。 。实际上,有两种解决方案。

解决方案1:设置测试目标的标题搜索路径构建设置

我认为,最优雅的解决方案是设置 test 目标的Header Search Paths构建设置。我提供了构建变量时,技术支持的Zizi Chen找出了正确的路径。对于只有一个数据模型且名称与项目相同(默认设置)的项目,标题搜索路径可能为:

  

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

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

对于具有多个数据模型的项目,应为每个数据模型的标题搜索路径添加非递归路径:

  

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

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

另一种解决方案是将数据模型添加到测试目标,而Zizi Chen提出了这个方案,我也在SO上对此进行了阅读。但是,以我的经验,这仅适用于单个数据模型。正如Chen Ziqiao Chen指出的那样,Xcode应该为测试目标生成与主要目标完全相同的文件。

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

答案 5 :(得分:0)

选择测试目标,导航至Build Settings并搜索设置" Header Search Paths"

然后添加以下条目:

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

将花括号替换为主目标名称(不是测试目标)和项目名称。

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

答案 6 :(得分:0)

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