Множественные Описания NSEntityDescriptions Утверждают Подкласс NSManagedObject



Я создаю фреймворк, который позволяет мне использовать основные данные. В тестовом объекте фреймворка я настроил модель данных с именем MockModel.xcdatamodeld. Он содержит одну сущность с именем MockManaged, которая имеет одно свойство Date.



Чтобы проверить свою логику, я создаю хранилище в памяти. Когда я хочу проверить свою логику сохранения, Я создаю экземпляр хранилища в памяти и использую его. Тем не менее, я продолжаю получать следующие выходные данные в консоли:

2018-08-14 20:35:45.340157-0400 xctest[7529:822360] [error] warning: Multiple NSEntityDescriptions claim the NSManagedObject subclass 'LocalPersistenceTests.MockManaged' so +entity is unable to disambiguate.
CoreData: warning: Multiple NSEntityDescriptions claim the NSManagedObject subclass 'LocalPersistenceTests.MockManaged' so +entity is unable to disambiguate.
2018-08-14 20:35:45.340558-0400 xctest[7529:822360] [error] warning: 'MockManaged' (0x7f986861cae0) from NSManagedObjectModel (0x7f9868604090) claims 'LocalPersistenceTests.MockManaged'.
CoreData: warning: 'MockManaged' (0x7f986861cae0) from NSManagedObjectModel (0x7f9868604090) claims 'LocalPersistenceTests.MockManaged'.
2018-08-14 20:35:45.340667-0400 xctest[7529:822360] [error] warning: 'MockManaged' (0x7f986acc4d10) from NSManagedObjectModel (0x7f9868418ee0) claims 'LocalPersistenceTests.MockManaged'.
CoreData: warning: 'MockManaged' (0x7f986acc4d10) from NSManagedObjectModel (0x7f9868418ee0) claims 'LocalPersistenceTests.MockManaged'.
2018-08-14 20:35:45.342938-0400 xctest[7529:822360] [error] error: +[LocalPersistenceTests.MockManaged entity] Failed to find a unique match for an NSEntityDescription to a managed object subclass
CoreData: error: +[LocalPersistenceTests.MockManaged entity] Failed to find a unique match for an NSEntityDescription to a managed object subclass


Ниже приведен объект, который я использую для создайте мои хранилища в памяти:



class MockNSManagedObjectContextCreator {

// MARK: - NSManagedObjectContext Creation

static func inMemoryContext() -> NSManagedObjectContext {
guard let model = NSManagedObjectModel.mergedModel(from: [Bundle(for: self)]) else { fatalError("Could not create model") }
let coordinator = NSPersistentStoreCoordinator(managedObjectModel: model)
do {
try coordinator.addPersistentStore(ofType: NSInMemoryStoreType, configurationName: nil, at: nil, options: nil)
} catch {
fatalError("Could not create in-memory store")
}
let context = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
context.persistentStoreCoordinator = coordinator
return context
}

}


Ниже то, что составляет мою сущность MockManaged:



class MockManaged: NSManagedObject, Managed {

// MARK: - Properties

@NSManaged var date: Date

}


Ниже то, что составляет мой XCTestCase:



class Tests_NSManagedObjectContext: XCTestCase {

// MARK: - Object Insertion

func test_NSManagedObjectContext_InsertsManagedObject_WhenObjectConformsToManagedProtocol() {
let context = MockNSManagedObjectContextCreator.inMemoryContext()
let changeExpectation = expectation(forNotification: .NSManagedObjectContextObjectsDidChange, object: context, handler: nil)
let object: MockManaged = context.insertObject()
object.date = Date()
wait(for: [changeExpectation], timeout: 2)
}

// MARK: - Saving

func test_NSManagedObjectContext_Saves_WhenChangesHaveBeenMade() {
let context = MockNSManagedObjectContextCreator.inMemoryContext()
let saveExpectation = expectation(forNotification: .NSManagedObjectContextDidSave, object: context, handler: nil)
let object: MockManaged = context.insertObject()
object.date = Date()
do {
try context.saveIfHasChanges()
} catch {
XCTFail("Expected successful save")
}
wait(for: [saveExpectation], timeout: 2)
}

func test_NSManagedObjectContext_DoesNotSave_WhenNoChangesHaveBeenMade() {
let context = MockNSManagedObjectContextCreator.inMemoryContext()
let saveExpectation = expectation(forNotification: .NSManagedObjectContextDidSave, object: context, handler: nil)
saveExpectation.isInverted = true
do {
try context.saveIfHasChanges()
} catch {
XCTFail("Unexpected error: (error)")
}
wait(for: [saveExpectation], timeout: 2)
}

}


Что я делаю, что вызывает ошибки в моих тестах?

376   1  

1 ответ:

Загрузка CoreData-это немного магии, где загрузка модели с диска и ее использование означает, что она регистрируется для определенных типов. Вторая загрузка пытается снова зарегистрироваться для типа, что, очевидно, говорит вам, что sth уже зарегистрировался для типа.

Вы можете загрузить CoreData только один раз и очистить этот экземпляр после каждого теста. Очистка означает удаление каждой сущности объекта и последующее сохранение. Существует некоторая функция, которая дает вам все сущности, которые вы можете затем извлечь и удалить. Партия удалить не существующих в памяти, хотя так объекта на управляемый объект именно там.

(вероятно, более простой) альтернативой является загрузка модели один раз, хранение ее где-то и повторное использование этой модели при каждом вызове NSPersistentContainer, у него есть конструктор для использования данной модели вместо того, чтобы загружать ее снова с диска.

Comments

    Ничего не найдено.