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