ios - 如何在不暴露私有(private)函数的情况下在单元测试中操作核心数据?

标签 ios swift unit-testing core-data xctest

在此先感谢您的帮助。

我有一个在 Swift 3.1 中使用核心数据堆栈实现的缓存服务。暴露的接口(interface)符合这个协议(protocol):

protocol WeekForecastCacheService {
  func add(cacheModels: [DayForecastCacheModel])
  func get(cityId: Int, callback: @escaping ([DayForecastCacheModel]?) -> () )
}

理想情况下,我希望我的核心数据堆栈的内部保持私有(private)。

但是我也希望能够对类(class)进行单元测试。特别是暴露的接口(interface)。因为核心数据堆栈是持久的,所以我希望能够删除每个实体(如果您要在已知状态下开始测试,则重置)。如何在将单元测试实现保持在我的主要目标之外的同时执行此操作。

理想情况下,我还希望我的测试独立于实现...

我正在按照以下思路思考,但可以提供一些建议:

  • 在缓存类中添加一个删除所有函数
  • 使用类扩展并在那里实现功能——这意味着大量的复制粘贴工作
  • 将私有(private)函数/变量更改为内部的,提供足够的访问权限,以便在类扩展中轻松创建删除所有函数
  • 别担心,因为使用服务的类只使用协议(protocol),所以类中的函数和属性是否私有(private)并不重要

最佳答案

在对 Core Data 进行单元测试时,一种典型的方法是使用内存存储类型来有效地去除 Core Data 的“持久”部分。使用内存存储,您可以获得 Core Data 的所有常用功能,但持久存储不会写入文件,因此它总是从空开始。这会让你进入一个已知的起始状态。如有必要,您可以在开始测试之前将其他一些已知状态预加载到内存中。

关键是 NSInMemoryStoreType。如果您设置显式添加持久存储,则调用 addPersistentStore(ofType:configurationName:at:options:) 时,这将是 type 值。如果您使用的是 NSPersistentContainer,则应在 persistentStoreDescriptions 属性中包含存储类型。

关于ios - 如何在不暴露私有(private)函数的情况下在单元测试中操作核心数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43858343/

相关文章:

ios - 即使 `edgesForExtendedLayout` 设置为 `top`,状态栏和 toplayout 指南底部 anchor 之间的差距

java - Mockito + PowerMock - 模拟 Thread.currentThread().getStackTrace()

ios - 在 iOS 8 自动高度的单元格内键入时,UITableView 在 endUpdates 上跳转到顶部

swift - 在 dispatch_source_set_timer 之前调用 dispatch_resume 可以吗?

ios - 如何快速检查使用 alamofire 创建的类模型是否为 nil?

ios - 将 1 个词典中的项目添加到另一个词典 -Swift iOS9

c# - 我是否应该使用 AutoFixture 来测试我的 Onion 的核心元素(它没有依赖项)?

unit-testing - 如果必要的单元测试失败,我可以使单元测试不确定吗?

ios - swift:iOS 根据条件显示警报操作

ios - 在后台持续更新 iOS 位置