2

SenTestCase で CoreData を使用しようとしています。問題は、見つからない NSManagedObjectModel です。アプリケーションバンドルでmomファイルを検索してURLで初期化しようとしましたが、見つかりませんでした。そのため、次のように切り替えました。

NSManagedObjectModel *objectModel = [NSManagedObjectModel mergedModelFromBundles:nil];

これは正しく機能しますが、メイン アプリケーションでのみ機能します。SenTestCase で実行しようとすると、返された objectModel にはエンティティがありません。

(gdb) po objectModel
(<NSManagedObjectModel: 0xab72480>) isEditable 0, entities {
}, fetch request templates {
}

mom ファイルを生成するためにどのようなセットアップが必要かはわかりません。アプリケーションのターゲットとテスト ターゲットのコンパイル済みソースのリストに .xcdatamodeld ファイルを追加しました。

次のコードは、アプリケーションの ViewController viewDidLoad メソッドでは正しく機能していますが、SenTestCase クラスのテスト ケースでは機能していません。

- (void)testCoreData {
    NSManagedObjectModel *objectModel = [NSManagedObjectModel mergedModelFromBundles:nil];


    NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];


    NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: objectModel];
    [context setPersistentStoreCoordinator: coordinator];

    NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    url = [url URLByAppendingPathComponent:@"TestDatabase"];

    NSLog(@"Path: %@", url);

    NSError *error;

    NSPersistentStore *newStore = [coordinator addPersistentStoreWithType:NSSQLiteStoreType
                                                        configuration:nil
                                                                  URL:url
                                                              options:nil
                                                                error:&error];

    if (newStore == nil) {
        NSLog(@"Store Configuration Failure\n%@",
              ([error localizedDescription] != nil) ?
              [error localizedDescription] : @"Unknown Error");
    }

    TaskSet *taskSet = [NSEntityDescription insertNewObjectForEntityForName:@"TaskSet" 
                                                 inManagedObjectContext:context];
    taskSet.taskSetId = @"1234";

    NSLog(@"TaskSet: %@", taskSet);
    NSError *saveError;
    if ([context save:&saveError]) {
        NSLog(@"Store Saved successfully");
    } else {
        NSLog(@"Store not saved! Error: %@", saveError);
    }
}

エラー:

Catchpoint 3 (exception thrown).Unknown.m:0: error: -[ControllerTest testCoreData] : +entityForName: could not locate an entity named 'TaskSet' in this model.

SenTestCase での実行と viewDidLoad での実行の違いは何ですか? コア データ モデルをテスト ケースにコンパイルするにはどうすればよいですか?

4

1 に答える 1

2

この質問は以前に回答されています: Unit Test can't find Core Data model file

SenTestCases がメインのバンドルを使用していないことを指摘した Luther Baker の功績は認められています。ファイルにデータを書き込みたい場合は、彼の回答で説明されているように、識別子を使用してバンドルを作成する必要があります。

于 2012-04-17T22:29:02.857 に答える