何をテストしているかによって異なります。コア データ モデルを実際の実装から概念的に分離することはやや困難です。そのため、通常は単体テスト コードで独自のスタックを構築します。一方、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;
}
コア データに関係するすべてのテスト ケースは、このサブクラスから継承する必要があります。インメモリ ストア タイプを使用していて、各テストでモデルを構築および破棄する場合は、依存関係を最小限に抑え、各テストで未入力のモデルから開始します。もちろん、パフォーマンスに関する約束はありません。
編集:
Core Data オブジェクトの単体テストを行う際に、この記事が役に立ちました - Unit testing Core Data-driven apps
編集2:
Graham Lee (上記の投稿の著者) は、モックに依存しない Core Data オブジェクトの単体テストに関する別の投稿をしています。上記の パターンは、2 番目のリンクで彼が行っていることとより一致しています。