CoreData+MagicalRecord 如何对记录是不是成功持久化到 sqlite 文件进行单元测试

Posted

技术标签:

【中文标题】CoreData+MagicalRecord 如何对记录是不是成功持久化到 sqlite 文件进行单元测试【英文标题】:CoreData+MagicalRecord How to unit test if a record is successfully persisted into sqlite fileCoreData+MagicalRecord 如何对记录是否成功持久化到 sqlite 文件进行单元测试 【发布时间】:2015-01-29 03:53:48 【问题描述】:

我正在使用 MagicalRecord 2.2。我正在编写测试用例以查看记录是否已成功保存到 sqlite。我正在做的是:

    [MagicalRecord setupCoreDataStackWithInMemoryStore] 创建内存中的 sqlite 数据库 Entity* entity = [Entity MR_createEntity] 创建实体 将实体持久化到 sqlite(这不会影响第 4 步) 现在我想获取如下实体:Entity* fetchedEntity = [Entity MR_findAll][0]

但是这种方式可以在不持久化到 sqlite 的情况下获取实体,因为它可以直接从上下文中访问。 有没有办法从数据库中创建新的上下文,或者我如何强制 coredata 从数据库中读取,这样我就可以知道它是否已成功持久化。

【问题讨论】:

【参考方案1】:

[Entity MR_createEntity]

的简写形式
[Entity MR_createEntityInContext:[NSManagedObjectContext MR_<some context>]]

根据MR_defaultContext 创建您自己的两个上下文,使用:

NSManagedObjectContext *saveContext = [NSManagedObjectContext MR_contextWithParent:[NSManagedObjectContext MR_defaultContext];
NSManagedObjectContext *testContext = [NSManagedObjectContext MR_contextWithParent:[NSManagedObjectContext MR_defaultContext];

2.中的命令会变成:

Entity *entity = [Entity MR_createEntityInContext:saveContext] 

第 4 行将变为

Entity *fetchedEntity = [Entity MR_findAllInContext:textContext][0]

严格来说,通过使用两个上下文,您不是在测试实体是否已持久化,而是在测试两个上下文之间的通信。据我所知,没有办法判断实体是从存储中获取还是从内部核心数据缓存中获取。为了更加自信,在获取testContext 之前重置saveContext 并验证saveContext 已经忘记了该实体。

如果您的实体与数据模型或验证方法中设置的验证限制不匹配,则持久化通常会失败。一旦实体通过验证,它也往往会被保存。

恕我直言,为验证和保存到商店之间的验证编写单元测试的工作量太大。除非有真正合理的怀疑,否则请相信 API。

【讨论】:

我认为我最好只信任 API。

以上是关于CoreData+MagicalRecord 如何对记录是不是成功持久化到 sqlite 文件进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章

CoreData 和 MagicalRecord - 只有当用户点击应用时,我应该如何正确处理更新数据?

未找到 CoreData+MagicalRecord.h 文件

CoreData (MagicalRecord) 返回错误的值

(CoreData) MagicalRecord 突然停止持久保存

在 TodayExtension 中使用 MagicalRecord (CoreData)

CoreData(MagicalRecord) 获取保存的对象