unit-testing - 单元测试中的新核心数据堆栈 (PersistenceController)

标签 unit-testing core-data

使用新的 Swift App Xcode 模板,我看到 PersistenceController 结构添加了一个 sharedpreview 实例作为核心数据堆栈。据我了解,preview 实例用于 SwiftUI 预览。

如果我有一个采用我的核心数据堆栈实例的服务类,我应该使用 preview 实例作为我的单元测试的一部分吗?或者我应该创建某种 spy /伪造的东西来传递到我正在测试的服务类中吗?

一般来说,测试使用 Core Data 的类的最佳实践是什么?

最佳答案

我也在研究这个。我没有找到最佳实践。所以我会总结一下我所做的。 PersistenceController 是一个不错的模式。

静态变量预览允许你创建一个不同的商店并向它添加一些对象,比如

  static var preview: PersistenceController = {
    let result = PersistenceController(inMemory: true)
    let viewContext = result.container.viewContext
    // this is the part where you can add mock data
    for _ in 0..<10 {
        let newItem = Note(context: viewContext)
        newItem.creationDate = Date()
    }
    do {
        try viewContext.save()
    } catch {
        let nsError = error as NSError
        fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
    }
    return result
}()

对于单元测试,我们希望从一个空存储开始,所以我在 PersistenceController 中又添加了一个变量

static let unitTest: PersistenceController = {
    let result = PersistenceController(inMemory: true)
    //empty store
    return result
}()

这使我的单元测试看起来像

class TestCoreDataStack: XCTestCase {

var coreDataStack: PersistenceController!

override func setUp() {
    super.setUp()
    coreDataStack = PersistenceController.unitTest
}

override func tearDown() {
  super.tearDown()
   //called after the invocation of each test method in the class.
   // I am deleted all notes to start fresh for the next test
  UnitTestHelpers.deleteAllNotes(container: coreDataStack.container)  
  coreDataStack = nil
}

func testAddNote() {
    let context = coreDataStack.container.viewContext
    
    let title = "my new title"
    let note = Note(title: title, context: context)
    
    XCTAssertNotNil(note, "note should not be nil")
    XCTAssertTrue(note.title == title)
    XCTAssertNotNil(note.creationDate, "notes date should not be nil")

} }

关于unit-testing - 单元测试中的新核心数据堆栈 (PersistenceController),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63911980/

相关文章:

java - JMockit 无法模拟来自 JRE 的具体集合

iOS Core Data 唯一对象获取

python - 如何使用 Python 中的 unittest 模块将两个对象列表与断言进行比较?

swift - 在单元测试中使用扩展更改默认实现

python - py.test 只找到 5 个项目,但我的类(class)有更多

node.js - Nodejs - Mocha、Chai 多重异步测试

ios - 无法让 InnerBand CoreData 框架工作

swift - 做声明

ios - 为订购应用程序设置核心数据关系

ios - 从核心数据中过滤标题