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

时间:2017-05-08 22:42:54

标签: ios swift unit-testing core-data xctest

提前感谢您的帮助。

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

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

理想情况下,我希望核心数据堆栈的内部保持私密性。

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

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

我正在考虑以下几点,但可以提出一些建议:

  • 将全部删除功能添加到缓存类
  • 使用类扩展并在那里实现功能 - 这意味着需要大量的复制粘贴
  • 将私有函数/变量更改为内部,提供足够的访问权限,以便在类扩展中轻松创建删除所有函数
  • 不要担心,因为只有协议被消费服务的类使用所以如果类中的函数和属性不是私有的并不重要

1 个答案:

答案 0 :(得分:0)

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

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