如何让单元测试访问核心数据模型

时间:2017-02-01 16:59:58

标签: swift xcode swift3

让我们说我在我的项目中制作了核心数据模型。我有其他类的方法接受这些模型并根据其属性执行一些功能。我如何对这些类进行单元测试?

使用普通的Swift文件,我在Xcode中选择它们并勾选一个框,使得在这些文件中定义的任何类对项目的单元测试部分可见。我的问题基本上是,如何使我的核心数据模型对测试也可见?

请注意,我不想在Core Data堆栈上执行任何操作,我只是希望能够创建模型的实例并将其传递给方法。

2 个答案:

答案 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}}初始化程序。