让我们说我在我的项目中制作了核心数据模型。我有其他类的方法接受这些模型并根据其属性执行一些功能。我如何对这些类进行单元测试?
使用普通的Swift文件,我在Xcode中选择它们并勾选一个框,使得在这些文件中定义的任何类对项目的单元测试部分可见。我的问题基本上是,如何使我的核心数据模型对测试也可见?
请注意,我不想在Core Data堆栈上执行任何操作,我只是希望能够创建模型的实例并将其传递给方法。
答案 0 :(得分:4)
由于CoreData使用托管对象,因此NSManagedObject的任何子类在功能上都没有价值,除非附加到上下文。
测试的一个技巧是在内存中创建NSManagedObjectContext并使用该上下文创建对象测试。 Outlined Here
这是在内存中创建上下文的代码:
func setUpInMemoryManagedObjectContext() -> NSManagedObjectContext {
let managedObjectModel = NSManagedObjectModel.mergedModelFromBundles([NSBundle.mainBundle()])!
let persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel)
do {
try persistentStoreCoordinator.addPersistentStoreWithType(NSInMemoryStoreType, configuration: nil, URL: nil, options: nil)
} catch {
print("Adding in-memory persistent store failed")
}
let managedObjectContext = NSManagedObjectContext()
managedObjectContext.persistentStoreCoordinator = persistentStoreCoordinator
return managedObjectContext
}
答案 1 :(得分:1)
更新:访问者实现是在运行时生成的,但如果模型对象未与NSManagedObjectContext
关联,则它们不可用。所以PEEJWEEJ的答案是要走的路。
如果我没有弄错的话,你的实体的Objective-C类(特别是它们的属性访问器)是在运行时使用它们时生成的。所以我希望您需要使用相应的NSManagedObject
调用NSEntityDescription
初始值设定项:
NSManagedObject(entity: entityDescription, insertInto: nil)
您可以通过使用NSManagedObjectModel
加载对象模型并使用例如{...}来获取相应的实体说明。该对象的entitiesByName
属性。
如果您为NSManagedObject
子类使用自定义代码(例如使用mogenerator生成),我会假设需要应用相同的过程 - 使生成的代码对您的测试可见并使用{ {1}}初始化程序。