在 iOS 开发中使用 OCUnit 对 XCode 4.5 中的核心数据对象进行单元测试
Posted
技术标签:
【中文标题】在 iOS 开发中使用 OCUnit 对 XCode 4.5 中的核心数据对象进行单元测试【英文标题】:Unit Testing with Core Data objects in XCode 4.5 using OCUnit in iOS-Development 【发布时间】:2012-07-02 19:34:00 【问题描述】:是否有一种简单的方法来出于测试原因创建 NSManagedObjects,而不使用为发布应用程序创建的托管对象上下文?
我现在已经在 Core Data 编码中工作了几个星期,但在细节方面仍然存在一些问题……为什么我不能只分配和初始化对象进行测试?我真的需要处理第二个持久存储/托管对象上下文(以及哪个)吗?
我必须测试一些在我的 NSManagedObject 子类中编写的方法...
【问题讨论】:
【参考方案1】:相信我,你不想在不使用 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;
【讨论】:
谢谢,我试试这个!但我有一个问题:你会把示例代码放在哪里?在每一个测试课上?这样做的最佳做法是什么? 还有一个问题:你为什么要继承 NSPersistantStoreCoordinator 和 NSManagedObjectContext 呢?我可以不用子类化吗? 还有一个问题:即使在将“#import以上是关于在 iOS 开发中使用 OCUnit 对 XCode 4.5 中的核心数据对象进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 的 OCUnit 测试能否在 iOS 设备而不是模拟器上运行