Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 单元测试中的新核心数据堆栈(PersistenceController)_Unit Testing_Core Data - Fatal编程技术网

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

Unit testing 单元测试中的新核心数据堆栈(PersistenceController),unit-testing,core-data,Unit Testing,Core Data,使用新的Swift App Xcode模板,我看到PersistenceController结构添加了一个shared和preview实例作为核心数据堆栈。据我所知,预览实例用于SwiftUI预览 如果我有一个服务类,它接受我的核心数据堆栈的一个实例,那么我是否应该在单元测试中使用preview实例?或者我应该创建某种类型的间谍/赝品来进入我正在测试的服务类 一般来说,测试使用核心数据的类的最佳实践是什么?我也只是在研究这个问题。我没有找到最佳实践。因此,我将总结我所做的工作。 Persiste

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

如果我有一个服务类,它接受我的核心数据堆栈的一个实例,那么我是否应该在单元测试中使用
preview
实例?或者我应该创建某种类型的间谍/赝品来进入我正在测试的服务类


一般来说,测试使用核心数据的类的最佳实践是什么?

我也只是在研究这个问题。我没有找到最佳实践。因此,我将总结我所做的工作。 PersistenceController是一个很好的模式

静态var预览允许您创建不同的存储并向其中添加一些对象,如

  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
}()
这使我的单元测试看起来像

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")

} }

我喜欢这个解决方案,但发现在测试之间没有重新初始化单元测试持久性控制器存在问题,并且我不想每次都手动删除所有内容。最后,我只需在设置中调用
coreDataStack=PersistenceController(inMemory:true)
,到目前为止这一切都正常。
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")

} }