在iOS开发中使用OCUnit对XCode 4.5中的核心数据对象进行单元测试

在iOS开发中使用OCUnit对XCode 4.5中的核心数据对象进行单元测试,ios,unit-testing,core-data,xcode4,ocunit,Ios,Unit Testing,Core Data,Xcode4,Ocunit,是否有一种简单的方法可以出于测试原因创建NSManagedObject而不使用为发布应用程序创建的托管对象上下文 我现在进入了核心数据编码的几个星期,但仍有一些细节问题。。。为什么我不能将alloc和init对象用于测试?我真的必须处理第二个持久存储/托管对象上下文吗(以及哪一个) 我必须测试在NSManagedObject子类中编写的一些方法…相信我,如果不使用MOC,您不想测试核心数据对象。你最多只能做些不健康的事情 但是,如果不想使用实际的数据库,请使用内存存储。设置起来很简单。事实上,我

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

我现在进入了核心数据编码的几个星期,但仍有一些细节问题。。。为什么我不能将alloc和init对象用于测试?我真的必须处理第二个持久存储/托管对象上下文吗(以及哪一个)


我必须测试在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;
}

相信我,您不想在不使用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框架添加到您的项目--“构建阶段”->“使用库链接二进制文件”并添加CoreDataThank,我将尝试这个!但是我有一个问题:你会把示例代码放在哪里?在每一个测试班?这样做的最佳实践是什么?还有一个问题:为什么要在那里为NSPersistantStoreCoordinator和NSManagedObjectContext子类?我可以不进行子类化吗?还有一个问题:即使在将“#import”放入我的.h文件后,所有核心数据类的Apple Mach-O链接器都会出错……我有一个简单的实用程序文件,其中包含用于测试的内容。代码只创建本机类型的对象。根本不涉及子分类。您必须将CoreData框架添加到您的项目--“构建阶段”->“使用库链接二进制文件”并添加CoreData