使用示例核心数据进行单元测试
Unit test with example Core Data
这是我的 XCTestCase 的开始 class:
var moc: NSManagedObjectContext!
override func setUp() {
super.setUp()
moc = self.setUpInMemoryManagedObjectContext()
self.fillManagedObjectContextWithExampleData(moc)
}
func setUpInMemoryManagedObjectContext() -> NSManagedObjectContext {
let modelName = "ProjectApp"
let modelURL = NSBundle.mainBundle().URLForResource(modelName, withExtension:"momd")!
let managedObjectModel = NSManagedObjectModel(contentsOfURL: modelURL)!
let persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel)
persistentStoreCoordinator.addPersistentStoreWithType(NSInMemoryStoreType, configuration: nil, URL: nil, options: nil, error: nil)
let managedObjectContext = NSManagedObjectContext()
managedObjectContext.persistentStoreCoordinator = persistentStoreCoordinator
return managedObjectContext
}
func fillManagedObjectContextWithExampleData(context: NSManagedObjectContext) {
// var firstSC = NSEntityDescription..insertNewObjectForEntityForName("StaticContent", inManagedObjectContext: context) as! StaticContent
var staticContentEntity = NSEntityDescription.entityForName("StaticContent", inManagedObjectContext: context)!
var firstSC = StaticContent(entity: staticContentEntity, insertIntoManagedObjectContext: context)
firstSC.name = "First Name"
var secondSC = StaticContent(entity: staticContentEntity, insertIntoManagedObjectContext: context)
secondSC.name = "Second Name"
var error: NSError? = nil
if context.save(&error) {
return
}
}
我只想创建 managedObjectContext(在内存中,仅用于测试)并用示例数据填充它。所以我可以使用:
managedObjectContext.executeFetchRequest(fetchRequest, error: nil) as! [StaticContent]
在我的单元测试中。它执行但是当我调用需要 [StaticContent]
的函数时我得到一个错误:
fatal error: NSArray element failed to match the Swift Array Element type
那么这有什么问题呢?我调用的函数工作正常。当我在我的应用程序中而不是在单元测试中使用它时,我没有问题。那我做错了什么?
我真的不想回答我的问题,但我找到了答案,我想帮助其他人。我找到了一部分代码,它根据实体 运行 的目标更改实体 class 的名称。所以我在创建 NSManagedObjectModel
的地方添加了这些代码行,它有助于:
// Create the module name
let moduleName = "ProjectAppTests"
// Create a new managed object model with updated entity class names
var newEntities = [] as [NSEntityDescription]
for (_, entity) in enumerate(managedObjectModel.entities) {
let newEntity = entity.copy() as! NSEntityDescription
newEntity.managedObjectClassName = "\(moduleName).\(entity.name)"
newEntities.append(newEntity)
}
let newManagedObjectModel = NSManagedObjectModel()
newManagedObjectModel.entities = newEntities
let persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: newManagedObjectModel)
不知道为什么使用 Swift 的 Core Data 中的 Class 名称如此复杂。但它有帮助,现在可以正常工作了。
在 swift 3.0 中:
</p>
<pre><code>func setUpInMemoryManagedObjectContext() -> NSManagedObjectContext {
let moduleName = "Model"
do {
let managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
let modelURL = Bundle.main.url(forResource: moduleName, withExtension:"momd")
let newObjectModel = NSManagedObjectModel.init(contentsOf: modelURL!)
let persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel : newObjectModel!)
try persistentStoreCoordinator.addPersistentStore(ofType: NSInMemoryStoreType, configurationName: nil, at: nil, options: nil)
managedObjectContext.persistentStoreCoordinator = persistentStoreCoordinator
return managedObjectContext
} catch let error as NSError {
logErr(error.localizedDescription)
XCTFail()
}
XCTFail("failed to created mocked coreData (inMemroy)")
return NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
}
func fillManagedObjectContextWithExampleData(context: NSManagedObjectContext) {
//lets assume you got some Food POJO class
do {
let foodJson: NSDictionary = ["id" : "1" , "foodId" : "1" , "displayName": "Pizza"]
let firstFood = try Food.createOrUpdate(dict: foodJson, inManagedObjectContext: context)
try context.save()
return
} catch let error as NSError {
logErr(error.localizedDescription)
}
}
这是我的 XCTestCase 的开始 class:
var moc: NSManagedObjectContext!
override func setUp() {
super.setUp()
moc = self.setUpInMemoryManagedObjectContext()
self.fillManagedObjectContextWithExampleData(moc)
}
func setUpInMemoryManagedObjectContext() -> NSManagedObjectContext {
let modelName = "ProjectApp"
let modelURL = NSBundle.mainBundle().URLForResource(modelName, withExtension:"momd")!
let managedObjectModel = NSManagedObjectModel(contentsOfURL: modelURL)!
let persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel)
persistentStoreCoordinator.addPersistentStoreWithType(NSInMemoryStoreType, configuration: nil, URL: nil, options: nil, error: nil)
let managedObjectContext = NSManagedObjectContext()
managedObjectContext.persistentStoreCoordinator = persistentStoreCoordinator
return managedObjectContext
}
func fillManagedObjectContextWithExampleData(context: NSManagedObjectContext) {
// var firstSC = NSEntityDescription..insertNewObjectForEntityForName("StaticContent", inManagedObjectContext: context) as! StaticContent
var staticContentEntity = NSEntityDescription.entityForName("StaticContent", inManagedObjectContext: context)!
var firstSC = StaticContent(entity: staticContentEntity, insertIntoManagedObjectContext: context)
firstSC.name = "First Name"
var secondSC = StaticContent(entity: staticContentEntity, insertIntoManagedObjectContext: context)
secondSC.name = "Second Name"
var error: NSError? = nil
if context.save(&error) {
return
}
}
我只想创建 managedObjectContext(在内存中,仅用于测试)并用示例数据填充它。所以我可以使用:
managedObjectContext.executeFetchRequest(fetchRequest, error: nil) as! [StaticContent]
在我的单元测试中。它执行但是当我调用需要 [StaticContent]
的函数时我得到一个错误:
fatal error: NSArray element failed to match the Swift Array Element type
那么这有什么问题呢?我调用的函数工作正常。当我在我的应用程序中而不是在单元测试中使用它时,我没有问题。那我做错了什么?
我真的不想回答我的问题,但我找到了答案,我想帮助其他人。我找到了一部分代码,它根据实体 运行 的目标更改实体 class 的名称。所以我在创建 NSManagedObjectModel
的地方添加了这些代码行,它有助于:
// Create the module name
let moduleName = "ProjectAppTests"
// Create a new managed object model with updated entity class names
var newEntities = [] as [NSEntityDescription]
for (_, entity) in enumerate(managedObjectModel.entities) {
let newEntity = entity.copy() as! NSEntityDescription
newEntity.managedObjectClassName = "\(moduleName).\(entity.name)"
newEntities.append(newEntity)
}
let newManagedObjectModel = NSManagedObjectModel()
newManagedObjectModel.entities = newEntities
let persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: newManagedObjectModel)
不知道为什么使用 Swift 的 Core Data 中的 Class 名称如此复杂。但它有帮助,现在可以正常工作了。
在 swift 3.0 中:
</p>
<pre><code>func setUpInMemoryManagedObjectContext() -> NSManagedObjectContext {
let moduleName = "Model"
do {
let managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
let modelURL = Bundle.main.url(forResource: moduleName, withExtension:"momd")
let newObjectModel = NSManagedObjectModel.init(contentsOf: modelURL!)
let persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel : newObjectModel!)
try persistentStoreCoordinator.addPersistentStore(ofType: NSInMemoryStoreType, configurationName: nil, at: nil, options: nil)
managedObjectContext.persistentStoreCoordinator = persistentStoreCoordinator
return managedObjectContext
} catch let error as NSError {
logErr(error.localizedDescription)
XCTFail()
}
XCTFail("failed to created mocked coreData (inMemroy)")
return NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
}
func fillManagedObjectContextWithExampleData(context: NSManagedObjectContext) {
//lets assume you got some Food POJO class
do {
let foodJson: NSDictionary = ["id" : "1" , "foodId" : "1" , "displayName": "Pizza"]
let firstFood = try Food.createOrUpdate(dict: foodJson, inManagedObjectContext: context)
try context.save()
return
} catch let error as NSError {
logErr(error.localizedDescription)
}
}