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 突然停止持久保存