Unit testing 具有内存存储的核心数据堆栈的单元测试持续失败

Unit testing 具有内存存储的核心数据堆栈的单元测试持续失败,unit-testing,core-data,Unit Testing,Core Data,我正在建立一个个人项目,让我的妻子和我监控我们的杂货消费习惯。应用程序使用核心数据,我在单元测试中遇到困难。我正在测试我的CoreDataStack类,以确保其方法正在保存和删除对象 以下是CoreDataStack: 内部类CoreDataStack{ //标记:-属性 私有let modelName:String 内部惰性var storeContainer:NSPersistentContainer={ let container=NSPersistentContainer(名称:self

我正在建立一个个人项目,让我的妻子和我监控我们的杂货消费习惯。应用程序使用核心数据,我在单元测试中遇到困难。我正在测试我的
CoreDataStack
类,以确保其方法正在保存和删除对象

以下是
CoreDataStack

内部类CoreDataStack{
//标记:-属性
私有let modelName:String
内部惰性var storeContainer:NSPersistentContainer={
let container=NSPersistentContainer(名称:self.modelName)
container.loadPersistentStores{(storeDescription,错误)位于
如果let error=错误为N错误{
fatalError(“未解决的错误\(error),\(error.userInfo)”)
}
}
返回容器
}()
内部惰性var managedContext:NSManagedObjectContext={
返回self.storeContainer.viewContext
}()
//标记:-初始化
内部初始化(modelName:String=“Cart”){
self.modelName=modelName
}
//马克:节省
内部函数saveContext(){
guard managedContext.hasChanges-else{
返回
}
做{
请尝试managedContext.save()
}将let错误捕获为NSError{
fatalError(“未解决的错误\(error),\(error.userInfo)”)
}
}
//标记:-删除
内部func删除(对象:NSManagedObject,来自上下文:NSManagedObjectContext){
context.delete(对象)
}
内部函数删除(allObjectsForEntity实体:字符串,来自上下文:NSManagedObjectContext){
让deleteFetchRequest=NSFetchRequest(entityName:entity)
让batchDeleteRequest=NSBatchDeleteRequest(fetchRequest:deleteFetchRequest)
做{
尝试storeContainer.persistentStoreCoordinator.execute(batchDeleteRequest,with:context)
}将let错误捕获为NSError{
fatalError(“未解决的错误\(error),\(error.userInfo)”)
}
}
}
我在我的测试目标中创建了一个子类
CoreDataStack
,名为
TestCoreDataStack
TestCoreDataStack
使用内存中的存储,以便在包含测试完成时将其销毁

下面是TestCoreDataStack

内部最终类TestCoreDataStack:CoreDataStack{
//标记:-初始化
内部重写初始化(modelName:String=“Cart”){
super.init(modelName:modelName)
让persistentstorescription=nspersistentstorescription()
persistentStoreDescription.type=NSInMemoryStoreType
let container=NSPersistentContainer(名称:modelName)
container.persistentstorescriptions=[persistentstorescription]
container.loadPersistentStores{(storeDescription,错误)位于
如果let error=错误为N错误{
fatalError(“未解决的错误\(error),\(error.userInfo)”)
}
}
self.storeContainer=容器
} 
}
我还有一个助手类,
ManagedObjectFetcher
,它只包含在我的测试目标中,用于在保存或删除托管对象后获取它们。使用此类是为了在保存或删除对象后验证计数以及是否存在正确的信息

她的是
ManagedObjectFetcher

内部最终类ManagedObjectFetcher{
//标记:-属性
私有let coreDataStack:coreDataStack
//标记:-初始化
内部初始化(coreDataStack:coreDataStack){
self.coreDataStack=coreDataStack
}
//马克:所有记录
内部函数所有记录(对于实体:T.Type)->[T]{
let request=T.fetchRequest()
做{
guard let results=尝试coreDataStack.managedContext.fetch(请求)作为?[T]else{
fatalError(“无效结果”)
}
返回结果
}抓住{
fatalError(“请求出错:\(错误)”)
}
}
}
CoreDataStackTests
是我的
XCTestCase
子类,用于测试
CoreDataStack
,以确保保存或删除对象

以下是
CoreDataStackTests

内部最终类CoreDataStackTests:XCTestCase{
//标记:-属性
私有var coreDataStack:TestCoreDataStack!
私有var managedObjectFetcher:managedObjectFetcher!
//MARK:-测试生命周期
覆盖函数设置(){
super.setUp()
coreDataStack=TestCoreDataStack()
managedObjectFetcher=managedObjectFetcher(coreDataStack:coreDataStack)
}
重写函数拆卸(){
coreDataStack=零
managedObjectFetcher=nil
super.tearDown()
}
//马克:节省
//测试1
内部功能测试\u CoreDataStack\u保存\u GroceryItem(){
让preResults=managedObjectFetcher.allRecords(for:GroceryItem.self)
xctasertequal(preResults.count,0,“应为'0`”)
let=GroceryItem(名称:“name”,singleItemPrice:Decimal(0.99),数量:1,日期:date(),isTaxable:true,managedObjectContext:coreDataStack.managedContext)
coreDataStack.saveContext()文件
让postResults=managedObjectFetcher.allRecords(for:GroceryItem.self)
xctasertequal(postResults.count,1,“应为'1`”)
}
//标记:-删除
//测试2
内部功能测试\u CoreDataStack\u删除\u GroceryItem(){
让initialResults=managedObjectFetcher.allRecords(for:GroceryItem.self)
xctasertequal(initialResults.count,0,“应为'0'))
让item=GroceryItem(名称:“name”,singleItemPrice:Decimal(0.99),数量:1,日期:date(),isTaxable:true,managedObjectContext:coreDataStack.managedContext)
coreDataStack.saveContext()文件
让preResults=managedObjectFetcher.allRecords(for:Gro