在 XCTest 中使用时,核心数据存储库为空

Core Data repository is empty when used in XCTest

在 XCTest class 中,我得到了这样的托管对象上下文:

//setup Core Data Stack
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"FabApp" withExtension:@"momd"];
NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
NSError *error = nil;
XCTAssertTrue([psc addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:&error] ? YES : NO, @"Should be able to add in-memory store");


self.moc = [[NSManagedObjectContext alloc] init];
self.moc.persistentStoreCoordinator = psc;

ManagedObejctContex 已成功创建,但当我尝试获取某些实体时,它找不到任何实体。我 100% 确定这些实体存在于核心数据中,因为我在应用程序中使用它们

- (void) testAllInputIsSavedInCoreData{
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Employ"
                                              inManagedObjectContext:_moc];
    [fetchRequest setEntity:entity];

    NSError *error = nil;
    NSArray *results = [_moc executeFetchRequest:fetchRequest error:&error];


    XCTAssertEqual([[_lines objectAtIndex:0] count], [results count],@"Missmatch in saved data read %lu but saved %lu",(unsigned long)[[_lines objectAtIndex:0] count], (unsigned long)[results count]);
}

这怎么可能,我是不是漏了什么?

  1. 检查测试模型URL是否与应用模型URL相同
  2. 检查测试MOM不为nil
  3. addPersistentStoreWithType::::: returns 商店或 nil(不是 BOOL)
  4. 您正在使用内存存储 PSC(未持久化)
  5. 在您的测试中,您是否首先将实体添加到内存中存储?
  6. [[_lines objectAtIndex:0] count] 看起来不对,而且您的 testAllInputIsSavedInCoreData 方法之前没有引用它。

您正在使用内存中持久存储 (NSInMemoryStoreType) 而不是 SQLite(或 XML)。内存存储中的所有内容 "stored" 都不会写入 sqlite 数据库,它只存在于上下文被释放之前,每次设置堆栈时都会发生这种情况。

编写单元测试时,您通常需要这种行为,因为您不希望每次 运行 测试时都在 Core Data 中存储额外的对象。