已经有很多关于此的主题,但我还没有找到适用于 Swift (Xcode 6.2) 的解决方案。
为了在 Swift 中测试 Core Data 支持的类,我生成了新的托管对象上下文,然后将其注入到我的类中。
//Given
let testManagedObjectContext = CoreDataTestComposer.setUpInMemoryManagedObjectContext()
let testItems = createFixtureData(testManagedObjectContext) as [TestItem]
self.itemDateCoordinator.managedObjectContext = testManagedObjectContext
//When
let data = self.itemDateCoordinator.do()
//Then
XCTAssert(data.exists)
问题来自于将测试中创建的 MOC 传递给正在执行的类。因为实体类是命名空间的,所以 Core Data 不会获取适当的 ManagedObject 子类,而是返回一个NSManagedObject
放。当循环或对这些对象执行任何操作时(在您的类中将是测试项目的数组([TestItem]
).
例如,违规班级ItemDateCoordinator
会执行这个循环(在从a中提取相关数据之后)NSFetchRequest
)"
for testItem in testItems {
testItem.doPart(numberOfDays: 10)
}
会导致:
致命错误:NSArray 元素无法匹配 Swift 数组元素类型
另外,我收集了一些信息,但没有太多可靠的答案:
- 为了在创建实体时投射实体,我一直在使用以下解决方案Jesse http://www.jessesquires.com/swift-coredata-and-testing/,但这不适用于更大范围的测试。
- A 解决方案已发布在另一个问题上 https://stackoverflow.com/a/26796530/205846这涉及在运行时交换类,但这对我来说对实体继承不起作用。
- 在这种情况下,还有另一种方法可以使用 Core Data 测试您的对象吗?你怎么做呢?
我正要向你指出Swift、Core Data 和单元测试但你已经找到了。 :)
该文章没有详细说明您的文件应该存在的位置(即在哪个 Target 中)。你不应该 add NSManagedObject
子类(或任何文件)both目标。我发现这会导致各种难以发现的错误和神秘错误。
And 绝对不要 do this https://stackoverflow.com/questions/24636888/swift-and-coredata-casting-issues-in-test-vs-non-test/26796530#26796530。这是一个可怕的黑客行为。
相反,让你的课程公开并import MyAppTarget
在你的XCTestCase
文件。更好的是,正如我在最近的文章中提到的,你的模型应该有自己的框架talk https://speakerdeck.com/jessesquires/using-core-data-in-swift(视频将在几周后发布在realm.io 上)。这样做可以使您的模型名称空间非常清晰并且通常更易于处理。那么你需要import MyAppModel
在您访问托管对象的任何地方。
我也有一个新的框架,JSQCore数据包 https://github.com/jessesquires/JSQCoreDataKit旨在让 Core Data 更容易在 Swift 中使用。该框架的一个关键部分是CoreDataStack
您可以使用内存存储来初始化它以进行测试。有带有示例的演示应用程序和评论良好的单元测试。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)