使用新的 Swift App Xcode 模板,我看到 PersistenceController
结构添加了一个 shared
和 preview
实例作为核心数据堆栈。据我了解,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/