在 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 ”放入我的 .h 文件之后,我仍然收到所有核心数据类的 Apple Mach-O 链接器错误。 . 我有一个简单的实用程序文件,其中包含用于测试的内容。该代码仅创建本机类型的对象。根本不涉及子分类。您必须将 CoreData 框架添加到您的项目中 -- “Build Phases” --> “Link Binary with Libraries” 并添加 CoreData

以上是关于在 iOS 开发中使用 OCUnit 对 XCode 4.5 中的核心数据对象进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 的 OCUnit 测试能否在 iOS 设备而不是模拟器上运行

为 iOS 构建 OCUnit 应用程序测试目标时出现链接器错误

iOS,Xcod7/8,iOS使用修改点

在我的 XCode 3 上安装 OCUnit 时出现问题

在 OCUnit 应用程序测试中绕过登录/身份验证

Xcode 4 中的 SenTest OCUnit