这取决于您要测试的内容。从概念上将核心数据模型与现实生活中的实现分开有些困难。所以我通常在单元测试代码中构建自己的堆栈。另一方面,如果您真的在测试仅依赖于NSManagedObject
子类实现的代码,那么我认为您概述的方法没有任何问题。
作为参考,如果您对如何为单元测试重新创建堆栈感兴趣,这就是我的做法。(我刚刚注意到您使用的是GHUnit
而不是OCUnit
- 它应该是相同的,但您可能需要确保该模型包含在GHUnit
应用程序的捆绑资源中。
创建一个继承自SenTestCase
并在那里构建您的核心数据堆栈的类NSInMemoryStoreType
:
@implementation CCFCoreDataTestCase {
NSManagedObjectModel *_mom;
NSPersistentStoreCoordinator *_psc;
NSManagedObjectContext *_moc;
NSPersistentStore *_store;
}
@synthesize managedObjectContext = _moc;
- (void)setUp {
[super setUp];
NSArray *bundles = [NSArray arrayWithObject:[NSBundle bundleForClass:[self class]]];
_mom = [NSManagedObjectModel mergedModelFromBundles:bundles];
_psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:_mom];
_store = [_psc addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:NULL];
STAssertNotNil(_store,@"Unable to create in-memory store");
_moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_moc setPersistentStoreCoordinator:_psc];
}
- (void)tearDown {
[super tearDown];
_mom = nil; _psc = nil; _moc = nil; _store = nil;
}
所有涉及核心数据的测试用例都应该继承自这个子类。假设您使用的是内存存储类型,并且每次测试都构建和拆除模型,您可以最小化任何依赖关系并从每个测试的未填充模型开始。当然,没有关于性能的承诺。
编辑:
我发现这篇文章在处理核心数据对象的单元测试时很有帮助 -单元测试核心数据驱动的应用程序
编辑2:
Graham Lee(上述帖子的作者)有另一篇关于单元测试不依赖于模拟的核心数据对象的帖子。看到这个 我上面描述的模式和他在第二个链接中所做的比较一致。