在 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]);
}
这怎么可能,我是不是漏了什么?
- 检查测试模型URL是否与应用模型URL相同
- 检查测试MOM不为nil
addPersistentStoreWithType:::::
returns 商店或 nil(不是 BOOL)
- 您正在使用内存存储 PSC(未持久化)
- 在您的测试中,您是否首先将实体添加到内存中存储?
[[_lines objectAtIndex:0] count]
看起来不对,而且您的 testAllInputIsSavedInCoreData
方法之前没有引用它。
您正在使用内存中持久存储 (NSInMemoryStoreType
) 而不是 SQLite(或 XML)。内存存储中的所有内容 "stored" 都不会写入 sqlite 数据库,它只存在于上下文被释放之前,每次设置堆栈时都会发生这种情况。
编写单元测试时,您通常需要这种行为,因为您不希望每次 运行 测试时都在 Core Data 中存储额外的对象。
在 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]);
}
这怎么可能,我是不是漏了什么?
- 检查测试模型URL是否与应用模型URL相同
- 检查测试MOM不为nil
addPersistentStoreWithType:::::
returns 商店或 nil(不是 BOOL)- 您正在使用内存存储 PSC(未持久化)
- 在您的测试中,您是否首先将实体添加到内存中存储?
[[_lines objectAtIndex:0] count]
看起来不对,而且您的testAllInputIsSavedInCoreData
方法之前没有引用它。
您正在使用内存中持久存储 (NSInMemoryStoreType
) 而不是 SQLite(或 XML)。内存存储中的所有内容 "stored" 都不会写入 sqlite 数据库,它只存在于上下文被释放之前,每次设置堆栈时都会发生这种情况。
编写单元测试时,您通常需要这种行为,因为您不希望每次 运行 测试时都在 Core Data 中存储额外的对象。