In the past, I've tested my CoreData layer in XCTests by setting up a managed object context in memory as described in this post. Basically:
class func setUpInMemoryManagedObjectContext() -> NSManagedObjectContext {
let managedObjectModel = NSManagedObjectModel.mergedModel(from: [Bundle.main])!
let persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel)
do {
try persistentStoreCoordinator.addPersistentStore(ofType: NSInMemoryStoreType, configurationName: nil, at: nil, options: nil)
} catch {
print("Adding in-memory persistent store failed")
}
let managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = persistentStoreCoordinator
return managedObjectContext
}
Recently I've been using Quick/Nimble with the same setup and in the expect
statements it always reads the properties of my NSManagedObject as being nil, even though they have values when I debug the tests. For example, where savedItem
is an NSManagedObject instance, when I store its property in a variable, it will pass:
let name = savedItem.name
it("should have a name") {
expect(name).to(equal(item.name))
}
but if I test savedItem.name
directly:
it("should have a name") {
expect(savedItem.name).to(equal(item.name))
}
the test fails with the message: expected ... got <nil>
How can I test my CoreData objects directly using Quick/Nimble?
The odd behaviour I was experiencing seems to have been related to the fact that I was initializing my NSManagedObject
directly inside the context
closure but before the it
closure. When I initialized it in a beforeEach
closure (inside of context
) it behaved as expected.