核心数据 - insertedObjects返回空集

时间:2014-03-13 11:18:36

标签: ios objective-c core-data

这是我的代码:

WDAlarm *alarm = [NSEntityDescription insertNewObjectForEntityForName:@"WDAlarm"
                                               inManagedObjectContext:[[UTCoreData sharedManager] managedObjectContext]];

我正在使用断点检查insertedObjects并且:

po [[[UTCoreData sharedManager] managedObjectContext] insertedObjects];

结果是:

{(
)}

{(
)}

UTCoreData是一个辅助类(而不是在app delegate中添加所有核心数据代码)。创建对象警报。根据Apple的文档:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/NSManagedObjectContext.html#//apple_ref/occ/instm/NSManagedObjectContext/reset insertedObjects

  

返回已插入接收器但尚未保存在持久存储中的对象集。

这正是我的情况,但它继续返回空集(并且未发布通知NSManagedObjectContextObjectsDidChangeNotification)。

更新1: sharedManager工作正常:

(lldb) po [[UTCoreData sharedManager] managedObjectContext] <NSManagedObjectContext: 0x920fff0>

(lldb) po [[UTCoreData sharedManager] managedObjectContext] <NSManagedObjectContext: 0x920fff0>

更新2:代码在生产代码中正常工作,而不是在XCTestCase中。我不知道它为什么会赢,尽管一切都是按预期创造的。

1 个答案:

答案 0 :(得分:1)

当您的单元测试依赖单例并且您没有测试单例时,您正在运行经典的依赖项问题。

正如Dan Shelly已经提到的,单元测试核心数据可能很困难。如何测试核心数据有一些最佳实践。我多年来在项目中使用的那个是在每个setUp方法中创建一个带有内存存储的新Core Data堆栈。重置/删除每个tearDown方法中的核心数据堆栈,以确保每个单元测试方法都有一个清新的堆栈。