【问题标题】:How do I manipulate core data in unit tests while not exposing private functions?如何在不暴露私有函数的情况下在单元测试中操作核心数据?
【发布时间】:2017-10-07 02:05:57
【问题描述】:

提前感谢您的帮助。

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

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 2019-07-13
      • 1970-01-01
      • 2017-04-24
      • 2016-02-14
      • 1970-01-01
      相关资源
      最近更新 更多