Ios 如何在不公开私有函数的情况下操作单元测试中的核心数据? 提前感谢您的帮助。

Ios 如何在不公开私有函数的情况下操作单元测试中的核心数据? 提前感谢您的帮助。,ios,swift,unit-testing,core-data,xctest,Ios,Swift,Unit Testing,Core Data,Xctest,我用Swift 3.1中的核心数据堆栈实现了一个缓存服务。公开接口符合此协议: protocol WeekForecastCacheService { func add(cacheModels: [DayForecastCacheModel]) func get(cityId: Int, callback: @escaping ([DayForecastCacheModel]?) -> () ) } 理想情况下,我希望核心数据堆栈的内部保持私有 但是,我也希望能够对类进行单元测试

我用Swift 3.1中的核心数据堆栈实现了一个缓存服务。公开接口符合此协议:

protocol WeekForecastCacheService {
  func add(cacheModels: [DayForecastCacheModel])
  func get(cityId: Int, callback: @escaping ([DayForecastCacheModel]?) -> () )
}
理想情况下,我希望核心数据堆栈的内部保持私有

但是,我也希望能够对类进行单元测试。特别是暴露的接口。因为核心数据堆栈是持久的,所以我希望能够删除每个实体(如果要在已知状态下启动测试,则需要重置)。我如何在保持单元测试实现在我的主要目标之外的情况下进行这项工作

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

我的想法大致如下,但可以提供一些建议:

  • 将delete all函数添加到缓存类
  • 使用一个类扩展并在那里实现功能-这将意味着大量的复制粘贴
  • 将私有函数/变量更改为内部函数,以便在类扩展中轻松创建delete all函数
  • 不要担心,因为使用服务的类只使用协议,所以类中的函数和属性是否非私有并不重要

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


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

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

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