在此先感谢您的帮助。
我有一个在 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/