2

私は Java 開発者で、Java エンティティを POJO としてテストしていました。ここで、Obj-C を使用して、NSManagedObject から継承するエンティティに対して同じことを行いたいと思います (永続化のために CoreData を使用します)。

たとえば、 Customer エンティティを次のようにテストしたいと思います。

-(void)myTest {
Customer *customer = [Customer alloc] init];
customer.name = @"toto";
GHAssertEqualStrings(customer.name, @"toto", @"");
}

しかし、私が遭遇したエラーは次のとおりです。

NSInvalidArgumentException Reason: -[Customers setName:]: 認識されないセレクターがインスタンスに送信されました ...

したがって、適切なデータベース スキーマ URL を使用して、setUp 内のすべての NSManagedObjectContext をロードしました。今、私は顧客をそのようにインスタンス化し、それが機能します:

Customers *customer = [NSEntityDescription
insertNewObjectForEntityForName:kDataBaseCustomerKey inManagedObjectContext:ctx];

しかし、 「POJO」をテストする適切な方法はありますか? この場合、データモデルを気にしないため、モデルをロードせずに Customer クラスをテストしたいと思います。

ご提案いただきありがとうございます。

よろしく。

4

1 に答える 1

5

何をテストしているかによって異なります。コア データ モデルを実際の実装から概念的に分離することはやや困難です。そのため、通常は単体テスト コードで独自のスタックを構築します。一方、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 番目のリンクで彼が行っていることとより一致しています。

于 2012-11-09T09:56:02.287 に答える