运行第二个单元测试时核心数据实体名称为零

     2023-03-05     20

关键词:

【中文标题】运行第二个单元测试时核心数据实体名称为零【英文标题】:Core Data entity name is nil while running a second unit test 【发布时间】:2018-12-08 10:38:55 【问题描述】:

我正在尝试为我的核心数据代码添加一些单元测试。但我总是有这个问题,第一个测试总是正确运行,但第二个测试崩溃,因为实体名称为零。

我也收到此错误:

Multiple NSEntityDescriptions claim the NSManagedObject subclass 'Gym.Exercise' so +entity is unable to disambiguate.

Failed to find a unique match for an NSEntityDescription to a managed object subclass

所以我的猜测是我在 tearDown(). 中没有做正确的事情

override func setUp() 
    super.setUp()

    coreDataStack = CoreDataStack(storeType: .inMemory)
    context = coreDataStack.context


override func tearDown() 
    coreDataStack.reset()
    context = nil
    super.tearDown()

这是我的CoreDataStack 课程:

final class CoreDataStack 
    var storeType: StoreType!
    public init(storeType: StoreType) 
        self.storeType = storeType
    

    lazy var persistentContainer: NSPersistentContainer = 
        let container = NSPersistentContainer(name: "Gym")
        container.loadPersistentStores  description, error in
            if let error = error 
                fatalError("Unresolved error \(error), \(error.localizedDescription)")
             else 
                description.type = self.storeType.type

            
        

        return container
    ()

    public var context: NSManagedObjectContext 
        return persistentContainer.viewContext
    

    public func reset() 
        guard let store = persistentContainer.persistentStoreCoordinator.persistentStores.first else  fatalError("No store found")
        guard let url = store.url else  fatalError("No store URL found")

        try! FileManager.default.removeItem(at: url)
        NSPersistentStoreCoordinator.destroyStoreAtURL(url: url)
    

以及destroyStoreAtURL的定义:

extension NSPersistentStoreCoordinator 
    public static func destroyStoreAtURL(url: URL) 
        do 
            let psc = self.init(managedObjectModel: NSManagedObjectModel())
            try psc.destroyPersistentStore(at: url, ofType: NSSQLiteStoreType, options: nil)
         catch let e 
            print("failed to destroy persistent store at \(url)", e)
        
    

我过去使用此代码进行单元测试并且它有效,不同之处在于过去我在编辑器中设置 NSManagedObject 类时使用了以下配置:

Module - Global namespace
Codegen - Class Definition

现在我使用:

Module - Current Product Module
Codegen - Manual/None

因为我想手动添加我的课程。

那么有人知道为什么现在的行为不同了吗?

edit - 我的 NSManagedObject 扩展助手(在尝试检索实体名称时,错误发生在 fetch() 方法的第一行):

extension Managed where Self: NSManagedObject 

    public static var entityName: String 
        return entity().name!
    

    public static func fetch(in context: NSManagedObjectContext, configurationBlock: (NSFetchRequest<Self>) -> () =  _ in ) -> [Self] 
        let request = NSFetchRequest<Self>(entityName: Self.entityName)
        configurationBlock(request)
        return try! context.fetch(request)
    

    public static func count(in context: NSManagedObjectContext, configure: (NSFetchRequest<Self>) -> () =  _ in ) -> Int 
        let request = NSFetchRequest<Self>(entityName: entityName)
        configure(request)
        return try! context.count(for: request)
    

    public static func findOrFetch(in context: NSManagedObjectContext, matching predicate: NSPredicate) -> Self? 
        guard let object = materializeObject(in: context, matching: predicate) else 
        return fetch(in: context)  request in
                request.predicate = predicate
                request.returnsObjectsAsFaults = false
                request.fetchLimit = 1
            .first
        

        return object
    

    public static func materializeObject(in context: NSManagedObjectContext, matching predicate: NSPredicate) -> Self? 
        for object in context.registeredObjects where !object.isFault 
           guard let result = object as? Self, predicate.evaluate(with: result) else 
               continue
           

           return result
        

        return nil
    

    public static func findOrCreate(in context: NSManagedObjectContext, matching predicate: NSPredicate, configure: (Self) -> ()) -> Self 
        guard let object = findOrFetch(in: context, matching: predicate) else 
           let newObject: Self = context.insertObject()
           configure(newObject)
           return newObject
        

        return object
    

【问题讨论】:

请显示出错的代码。 @pbasdf: 完成,在 fetch(...) 方法内部发生错误,尝试检索实体名称时的第一行 考虑到该错误,首先想到的是您可能无意中在模型编辑器中定义了具有相同类的两个实体。您是否检查了所有实体定义以确保它们具有正确的类? @pbasdf:模型中只添加了一个实体,并且在代码中由我定义了一次。所以什么也没产生。 【参考方案1】:

您应该尝试删除所有找到的 persistentStore 实例,而不是删除第一个。

尝试使用以下替换重置功能:

public func reset() 
    let stores = persistentContainer.persistentStoreCoordinator.persistentStores
    guard !stores.isEmpty else 
        fatalError("No store found")
    
    stores.forEach  store in
        guard let url = store.url else  fatalError("No store URL found")

        try! FileManager.default.removeItem(at: url)
        NSPersistentStoreCoordinator.destroyStoreAtURL(url: url)
    

看看你是否还有问题。

【讨论】:

现在我收到以下错误:尝试获取请求时出现 NSSQLiteErrorDomain = 522。所以当在 fetch(...) 方法中调用“return try!context.fetch(request)”时。 而再次运行时,总是在加载持久化存储的时候报错,同样,522错误。

核心图像过滤器的输出图像第二次在 UIImage 上运行时为零

】核心图像过滤器的输出图像第二次在UIImage上运行时为零【英文标题】:Coreimagefilter\'soutputimageisnilsecondtimeitisrunonaUIImage【发布时间】:2015-02-0620:06:48【问题描述】:我正在使用CoreImage将棕褐色滤镜应用于图像。我将过滤器设置... 查看详情

获取后核心数据关系为零

】获取后核心数据关系为零【英文标题】:Coredatarelationshipnilafterfetching【发布时间】:2014-06-2611:18:27【问题描述】:这是Bestpracticefortemporaryentitiesincoredata?的后续问题。我提出了一个新话题,因为我认为这是一个不同的问题。当... 查看详情

实体名称更改时核心数据建模器不更新

】实体名称更改时核心数据建模器不更新【英文标题】:CoreDatamodelernotupdatingwhenentitynameschange【发布时间】:2014-04-0914:56:09【问题描述】:我在使用CoreData建模器时遇到问题。我遇到了一个问题,我需要更改建模器中的实体名称... 查看详情

创建了核心数据实体但未保存属性

】创建了核心数据实体但未保存属性【英文标题】:CoreDataEntityCreatedButAttributesNotSaving【发布时间】:2015-02-2013:25:02【问题描述】:我有一个相对简单的实体。当我创建它,设置它的属性并保存它时,它保存成功。我稍后可以检... 查看详情

核心数据保存和加载到多个实体

...收到警告,我需要对其进行规范化。好的,所以我创建了第二个实体,以双向存储更多数据。问题是当我尝试保存数据时,数据会保存并重新加载到第一个 查看详情

eclipse链接重复键奇怪的错误

...体(customer1)创建数据时,数据已成功创建但是当我想为第二个实体创建数据时,我收到以下错误。我们在两个不同的包中使用不同的表注释名称生成这两个实体,所以我不明白为什么我会收到此错误。我们还为每个实体创建不... 查看详情

使用 GenericDAO 插入第二个数据源时出错

】使用GenericDAO插入第二个数据源时出错【英文标题】:ErrorinsertingseconddatasourcewithGenericDAO【发布时间】:2019-04-1608:14:30【问题描述】:我正在尝试在persistence.xml中插入第二个碱基。我已经在jboss中配置了数据源并对其进行了测试... 查看详情

保存到多个实体中 - 核心数据 - Swift

...从一个函数存储到2个不同的实体中,但在将数据存储到第二个实体时运气不佳。我的2个实体被称为-Job和ShootKitChecklist。我创建了一个核心数据管理器,我已将其剥离,只是为了向您展示我正在使用的部 查看详情

无法使用第二个数据源运行 Spring JUnit 测试

】无法使用第二个数据源运行SpringJUnit测试【英文标题】:NotabletorunSpringJUnittestswithseconddatasource【发布时间】:2016-03-0323:04:09【问题描述】:我正在使用SpringJUnit4ClassRunner来运行我的集成测试。我必须在我的SpringBootRESTWeb服务中使... 查看详情

核心数据——传递实体名称或引用整个实体?

】核心数据——传递实体名称或引用整个实体?【英文标题】:CoreData--passnameofentityorreferencetoentireentity?【发布时间】:2015-03-2401:27:23【问题描述】:我正在制作一个简单的银行帐户跟踪器,用于自学目的。我正在使用CoreData存储... 查看详情

在单元测试中构建核心数据堆栈时出错

】在单元测试中构建核心数据堆栈时出错【英文标题】:ErrorBuildingCoreDataStackinUnitTests【发布时间】:2010-07-1420:00:23【问题描述】:我正在尝试开始对使用CoreData的应用程序进行单元测试。在我的单元首次测试的setUp方法中,我可... 查看详情

加密核心数据迁移实体名称不匹配问题

】加密核心数据迁移实体名称不匹配问题【英文标题】:Encryptedcoredatamigrationentitynamemismatchissue【发布时间】:2015-11-0102:33:00【问题描述】:我正在使用核心数据加密,并且我在Appstore中的应用程序的当前版本使用加密数据库。现... 查看详情

Xcode:运行 XC 单元测试时,模块名称“”不是有效标识符

】Xcode:运行XC单元测试时,模块名称“”不是有效标识符【英文标题】:Xcode:modulename""isnotavalididentifierwhilerunningXCunittest【发布时间】:2017-07-2420:49:07【问题描述】:尝试使用SDWebImage设置我的CocoaPods运行XCTest,我只能看... 查看详情

撤消 IDatabaseTester setDataSet()

...使用IDatabaseTester来加载架构,然后是来自XML的数据。单独运行时,一切顺利。但连续运行时,第二个JUnit测试失败,因为“TABLE名称已存在”。我发现HSQLDB数据库被尝试加载两次。第二 查看详情

添加第二个 EF 核心数据库后 Blazor 服务器端 docker 容器分段错误

...直在尝试对blazor服务器端应用程序进行身份验证。启动和运行UI进展顺利,第一个问题是尝试在无法解密的云平台上运行容器时 查看详情

为啥我不能使用“描述”作为核心数据实体的属性名称?

】为啥我不能使用“描述”作为核心数据实体的属性名称?【英文标题】:Whycan\'tIuse"description"asanattributenameforaCoreDataentity?为什么我不能使用“描述”作为核心数据实体的属性名称?【发布时间】:2011-01-1720:25:54【问题描... 查看详情

当模态视图(第二个视图)被关闭时刷新 ViewController 中的核心数据 - Swift

】当模态视图(第二个视图)被关闭时刷新ViewController中的核心数据-Swift【英文标题】:RefreshCoreDatainViewControllerwhenModalView(2ndview)isDismissed-Swift【发布时间】:2016-03-2915:29:48【问题描述】:我试图弄清楚如何在关闭模态视图后重新... 查看详情

单元测试时托管对象上下文为零restkit

】单元测试时托管对象上下文为零restkit【英文标题】:managedobjectcontextnilrestkitwhileunitTesting【发布时间】:2015-06-2113:00:39【问题描述】:我正在使用使用cocoapods集成的restkit(0.24.1)为我的应用程序开发单元测试:pod"RestKit/Testing","~&g... 查看详情