CoreData+MagicalRecord 如何单元测试一条记录是否成功持久化到sqlite文件中

CoreData+MagicalRecord How to unit test if a record is successfully persisted into sqlite file

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

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

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

[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 除非真的有真正合理的怀疑。