NSManagedObjectModel 用 mergeModelFromBundles 初始化:nil 在 SenTestCase 中找不到模型

Posted

技术标签:

【中文标题】NSManagedObjectModel 用 mergeModelFromBundles 初始化:nil 在 SenTestCase 中找不到模型【英文标题】:NSManagedObjectModel initialized with mergedModelFromBundles:nil not finding model in SenTestCase 【发布时间】:2012-04-17 08:11:16 【问题描述】:

我正在尝试在 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 中运行有什么区别?我需要做什么才能将核心数据模型编译成测试用例?

【问题讨论】:

【参考方案1】:

这个问题之前已经回答过:Unit Test can't find Core Data model file

感谢 Luther Baker 指出 SenTestCases 没有使用主 Bundle。如果您想将数据写入文件,则必须使用他的回答中描述的标识符创建包。

【讨论】:

以上是关于NSManagedObjectModel 用 mergeModelFromBundles 初始化:nil 在 SenTestCase 中找不到模型的主要内容,如果未能解决你的问题,请参考以下文章

我应该将 NSManagedObjectModel 保留在属性中以供以后使用吗?

NSManagedObject、NSManagedObjectContext 和 NSManagedObjectModel 的区别

NSManagedObjectModel 合并模型FromBundles 错误

尝试使用前向类“NSManagedObjectModel”作为 Swift 类模型的超类

NSInternalConsistencyException 原因 +entityForName:找不到实体名称的 NSManagedObjectModel

+entityForName: 找不到实体名称的 NSManagedObjectModel