Ios 核心数据-insertedObjects返回空集

Ios 核心数据-insertedObjects返回空集,ios,objective-c,core-data,Ios,Objective C,Core Data,这是我的密码: WDAlarm *alarm = [NSEntityDescription insertNewObjectForEntityForName:@"WDAlarm" inManagedObjectContext:[[UTCoreData sharedManager] managedObjectContext]]; 我正在使用断点检查InsertedObject,并且: po [[[UTCo

这是我的密码:

WDAlarm *alarm = [NSEntityDescription insertNewObjectForEntityForName:@"WDAlarm"
                                               inManagedObjectContext:[[UTCoreData sharedManager] managedObjectContext]];
我正在使用断点检查InsertedObject,并且:

po [[[UTCoreData sharedManager] managedObjectContext] insertedObjects];
结果是:

{(
)}

{(
)}
UTCoreData是一个助手类(而不是在app delegate中添加所有核心数据代码)。将创建对象报警。根据苹果在这里的文档:插入对象

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

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

更新1:sharedManager工作正常:

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

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

更新2:该代码在生产代码中运行良好,而不是在XCTestCase中。我不知道为什么它不会,尽管一切都是按预期创建的。

当单元测试依赖于单例而不是测试单例本身时,您运行的是一个典型的依赖性问题


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

18个视图没有答案?我猜您的
sharedManager
在每次调用时返回一个新的管理器会有问题,或者您的
managedObjectContext
方法在每个callNope上返回一个新上下文。每次我打印它时,它都返回相同的对象。检查Q中的更新。不过谢谢你的回答。还有其他想法吗?这让我发疯了。顺便说一句,这是在XCTestCase中,不是生产代码?“这可能是原因吗?”丹雪莉,我想你是对的。出于某些原因,有两个ManagedObjectContext!我现在正在调试代码。测试和CoreData存在一些问题(我不太熟悉)。我发现设置和拆除整个堆栈或完全模拟它更容易(你不需要测试框架…除非你测试已知错误的修复)+1,我遵循测试。这是测试核心数据代码的一种方法。然而,在我的情况下,它不起作用。我的代码测试UTCoreData和数据控制器之间的交互。我知道这与单元测试的基本原则相冲突。然而,我发现这种方法提供了更健壮的应用程序。此外,代码侦听托管上下文中的更改以更新某些区域。在您测试核心数据的方式中,这需要我在数据控制器中注入上下文,以便侦听修改并正确操作(这会弄乱我的生产代码)。