1

是否有一种简单的方法可以出于测试原因创建 NSManagedObjects 而无需使用为发布应用程序创建的托管对象上下文?

我现在已经进行了几周的 Core Data 编码,但在细节方面仍然存在一些问题……为什么我不能只分配和初始化对象进行测试?我真的必须处理第二个持久存储/托管对象上下文(以及哪个)吗?

我必须测试一些在我的 NSManagedObject 子类中编写的方法......

4

1 回答 1

4

相信我,你不想在不使用 MOC 的情况下测试核心数据对象。你最多只能做不健全的事情。

但是,如果您不想使用实际的数据库,请使用内存存储。设置非常简单。事实上,我在自己的许多单元测试中都使用了它。

不过,我警告你。SQL 存储和内存存储有许多不同的行为。最常见的问题是谓词。阅读文档以确保您的谓词是正确的。

我会说,在测试期间,您可以使用内存中 MOC,但您应该有一个配置来运行您在实际数据库本身上进行的所有测试,以确保它能够正常工作。为了速度,也许您将内存数据库用于正常使用,而将实际数据库用于计划的持续集成测试。

作为一个例子,你可以做这样的事情来创建你的内存 MOC ......

- (NSManagedObjectContext*)managedObjectContextWithConcurrencyType:(NSManagedObjectContextConcurrencyType)concurrencyType {
    NSManagedObjectModel *mom = [NSManagedObjectModel mergedModelFromBundles:nil];
    STAssertNotNil(mom, @"Can not create MOM from main bundle");

    NSPersistentStoreCoordinator *psc = [[MyPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
    STAssertNotNil(psc, @"Can not create persistent store coordinator");
    NSPersistentStore *store = [psc addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:0];
    STAssertNotNil(store, @"Can not create In-Memory persistent store");

    MyManagedObjectContext *moc = [[MyManagedObjectContext alloc] initWithConcurrencyType:concurrencyType];
    moc.persistentStoreCoordinator = psc;

    return moc;
}
于 2012-07-02T23:09:39.247 回答