是否有一种简单的方法可以出于测试原因创建 NSManagedObjects 而无需使用为发布应用程序创建的托管对象上下文?
我现在已经进行了几周的 Core Data 编码,但在细节方面仍然存在一些问题……为什么我不能只分配和初始化对象进行测试?我真的必须处理第二个持久存储/托管对象上下文(以及哪个)吗?
我必须测试一些在我的 NSManagedObject 子类中编写的方法......
是否有一种简单的方法可以出于测试原因创建 NSManagedObjects 而无需使用为发布应用程序创建的托管对象上下文?
我现在已经进行了几周的 Core Data 编码,但在细节方面仍然存在一些问题……为什么我不能只分配和初始化对象进行测试?我真的必须处理第二个持久存储/托管对象上下文(以及哪个)吗?
我必须测试一些在我的 NSManagedObject 子类中编写的方法......
相信我,你不想在不使用 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;
}