【问题标题】:How to access Core Data generated Obj-C classes in test targets?如何在测试目标中访问 Core Data 生成的 Obj-C 类?
【发布时间】:2014-08-05 18:26:49
【问题描述】:

我在 Xcode 6 中有一个 Core Data / Swift Cocoa 应用程序项目(我们将项目称为 Stuff)。我创建了一个名为 Query 的 Core Data 实体,并使用 Xcode 为其创建了一个 NSManagedObject 子类。

那时,Xcode 6 提供为我创建桥接头,正如预期的那样,并创建了Stuff-Bridging-Header.h。一旦我在桥接头中 #import "Query.h",我的模型对象 Query 就可以在我的应用目标 Swift 代码中使用。

如何使 Query Core Data 对象(由 Xcode 生成的 Query.h 和 Query.m 支持)可用于我的测试目标 Swift 代码 StuffTests?我尝试手动创建一个头文件 StuffTests-Bridging-Header.h 并将 #import "Query.h" 添加到其中,但我的 Swift 测试类无法解析 Query 类。

【问题讨论】:

  • 您是在使用现有的 Objective-C 代码还是这是一个新的“Swift”项目?

标签: core-data swift xctest


【解决方案1】:

我有一个纯 Swift 中的 CoreData 项目,没有桥接头文件和测试正在工作。 以下是我设法做到的:

我的项目名称是 cars,我有一个名为 Car

的 NSManagedObject

汽车.swift:

Car.swift 文件目标成员:

cars.xcdatamodeld 数据模型检查器:

【讨论】:

  • 请记住:目前,Xcode 6.1 在生成带有 app 前缀的子类时遇到了困难,这使得正确的方法很痛苦。它不会生成实体子类,而是生成单个“前缀”类,因此您需要使用“obj()”或生成不附加前缀的子类,然后将其添加到模型中。
  • 我有相同的结构,但无论如何,当我创建一个对象并进行转换时,转换失败。这有效:var object: AnyObject = NSEntityDescription.insertNewObjectForEntityForName("Photo", inManagedObjectContext: context),但随后失败:var photo = object as Photo
  • 我终于设法让它工作:NSEntityDescription.insertNewObjectForEntityForName 方法不起作用,但找到实体然后创建对象工作。第一步:let entity = NSEntityDescription.entityForName("Photo", inManagedObjectContext: context),然后是photo = Photo(entity: entity!, insertIntoManagedObjectContext: context)
【解决方案2】:

我花了一段时间才弄明白。理想的解决方案是在测试目标本身中导入桥接头。进入Build Settings > Swift compiler > Code Generation 并给出你的桥接头名称。 注意,默认不选择测试目标。您必须在滚动条中选择它(它与常规、信息、构建设置、构建阶段和构建规则位于同一行)。 这样,您的项目和不同的测试目标将拥有相同的桥接头。

【讨论】:

  • 但是像 zumzum 一样,我没有桥接头,我的应用程序目标有效,但我的测试目标没有。
【解决方案3】:

您可以在 Swift 中直接使用NSManagedObject,如下所示:

class Query : NSManagedObject {
  @NSManaged var attrOne : attrOneType
  // ...
}

目前 Xcode 不会为实体生成 Swift 代码;它仍然只生成Objective-C,这可能会导致您找到一个桥接解决方案。但是,您不需要桥接 - 只需从生成的 Objective-C 开始并使用 @NSManaged 注释编写 Swift 代码。

【讨论】:

  • 我明白这一点,我对 Obj-C 生成的代码很好。通过将 Query.h 导入桥接头,我的 NSManagedObject 子类 Query 在 Swift 中可用,但仅在我的应用程序目标中可用。我也想在我的测试中使用它,但不知道如何实现。
  • 我的应用程序中没有桥接头,并且核心数据有效。但是,使用核心数据的测试不会。还不知道为什么。
  • @DanielD 但是应该在测试桥接头中导入什么?因为#import "Query.h" 不会被测试目标找到。是否还需要更新 Include Headers 路径以引用应用程序目标的构建标头?像这样的东西? $(CONFIGURATION_TEMP_DIR)/.build/DerivedSources
猜你喜欢
  • 2013-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多