【问题标题】:How to test Core Data properly in Swift如何在 Swift 中正确测试 Core Data
【发布时间】:2015-06-19 11:08:02
【问题描述】:

这方面已经有很多主题了,但我还没有找到适用于 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 将执行此循环(在从NSFetchRequest 提取相关数据之后)"

for testItem in testItems {
    testItem.doPart(numberOfDays: 10)
}

会导致:

致命错误:NSArray 元素无法匹配 Swift Array 元素类型

另外,我遇​​到了很多没有可靠答案的信息:

  • 要在创建实体时强制转换,我一直在使用Jesse 的解决方案,但这不适用于更大范围的测试。
  • solution has been posted on another question 涉及在运行时换出类,但这对我来说不适用于实体继承。
  • 在这种情况下,是否有其他方法可以使用 Core Data 测试您的对象?你怎么做呢?

【问题讨论】:

  • 您是否面临模拟问题?

标签: ios swift core-data nsmanagedobjectcontext


【解决方案1】:

我正要向您介绍 Swift、Core Data 和单元测试,但您已经找到了。 :)

该帖子没有详细说明您的文件应该存在的位置(即,在哪个目标中)。您不应该NSManagedObject 子类(或任何文件)添加到两个目标。我发现这会导致各种难以发现的错误和神秘错误。

并且绝对不要这样做this。这是一个可怕的黑客攻击。

相反,将您的课程公开并在您的XCTestCase 文件中公开import MyAppTarget。更好的是,您的模型应该在我最近的talk 中提到的自己的框架中(视频将在几周后发布在 realm.io 上)。这样做会使您的模型命名空间非常清晰,并且通常更容易处理。然后你需要import MyAppModel 访问你的托管对象。

我还有一个新框架JSQCoreDataKit,旨在让 Core Data 在 Swift 中更易于使用。这个框架的一个关键部分是CoreDataStack,您可以使用内存存储进行初始化,以进行测试。有带有示例的演示应用程序和注释良好的单元测试。

【讨论】:

  • 谢谢,这是最终让我找到解决方案的答案(Xcode 7,Swift 2)。仅将您的 NSManagedObject 子类文件添加到主目标,而不是测试目标。我发现没有必要将它们公开(我认为这是 Xcode 7 的更改)。我在测试文件的顶部添加了:@testable import MY_MODULE_NAME。
  • 通过使用@testable import ModuleName 解决,如此处所述; natashatherobot.com/swift-2-xcode-7-unit-testing-access
【解决方案2】:

我相信这是最近更新的(iOS 9/Swift 2.0),在导入的目标上使用了 testable 关键字,这意味着目标的内部类(默认)变为公共的。来自文档:

所以要添加到上面的 jessesquires 答案中,请将 @testable 附加到您的导入中,这应该可以解决单元测试错误:

@testable import MyAppTarget

【讨论】:

猜你喜欢
  • 2022-01-19
  • 2020-05-10
  • 2014-12-20
  • 2013-10-22
  • 2013-10-14
  • 2015-02-20
  • 2017-11-11
相关资源
最近更新 更多