【问题标题】:Core Data repository is empty when used in XCTest在 XCTest 中使用时核心数据存储库为空
【发布时间】:2015-12-24 20:21:37
【问题描述】:

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

//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% 确定这些实体存在于 Core Data 中

- (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]);
}

这怎么可能,我错过了什么吗?

【问题讨论】:

  • 您是否尝试过在模拟器中删除您的项目应用并再次运行它?
  • 是的,现在。没用!

标签: ios objective-c core-data ios9 xctest


【解决方案1】:
  1. 检查测试modelURL是否与应用modelURL相同
  2. 检查测试 MOM 是否不为零
  3. addPersistentStoreWithType::::: 返回 store 或 nil(不是 BOOL)
  4. 您正在使用内存存储 PSC(未持久化)
  5. 在您的测试中,您是否首先将实体添加到内存存储中?
  6. [[_lines objectAtIndex:0] count] 看起来不正确,并且之前在您的 testAllInputIsSavedInCoreData 方法中没有引用它。

【讨论】:

  • 1, 2, 3,检查并确定。 6也可以。 4 和 5 在我的测试中,我实际上并没有在 Core Data 中添加对象,而是在 AppDelegate 的 didFinishLaunchingWithOptions 中进行的。
【解决方案2】:

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

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

【讨论】:

  • 如何测试应用程序在 Core Data 上是否正确写入
  • 只要您不重新创建/取消分配 moc,Core Data 堆栈应该可以按您的预期工作
  • 其实我想把 AppDelegate 的一个方法(我在 Core Data 中写对象)的行为作为一个黑盒来测试。我不想在 XCTest 中调用该方法。我做错了吗?
  • 如果我想测试该方法,我应该传递对我在 XCTest 中创建的新 moc 的引用...
  • 没错,这个术语就是依赖注入,它使测试变得更容易
猜你喜欢
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 1970-01-01
相关资源
最近更新 更多