swift - 测试内存中 Realm 迁移

标签 swift unit-testing migration realm

我们正在尝试使用 XCTest 对 Realm 迁移过程进行单元测试。我们的想法是在设置测试时准备一个内存中的 Realm。该 Realm 将包含一组存储的模型,模拟一些启动条件。​​

在测试期间,我们希望模拟迁移过程并检查迁移 Realm 的最终状态。

我们使用Configuration工厂配置第一个Realm:

func getConfiguration() -> Realm.Configuration {
    return Realm.Configuration(inMemoryIdentifier: "AppTest", 
        readOnly: false, 
        schemaVersion: 10, 
        migrationBlock: nil)
}

然后我们插入所有对象来模拟我们的起始条件。当我们访问Realm时,将检索并使用第一个配置。在第一次实例化我们的 Realm 之前,我们还将其设置为默认配置:

Realm.Configuration.defaultConfiguration = getConfiguration()

当测试启动时,我们尝试通过尝试获取Realm的新实例来模拟迁移,并将另一个配置传递给其初始化程序:

func getConfiguration() -> Realm.Configuration {
    return Realm.Configuration(inMemoryIdentifier: "AppMigrationTest",
        readOnly: false, 
        schemaVersion: 21, 
        migrationBlock: { (migration: RealmSwift.Migration, oldSchemaVersion: UInt64) in
            // Migration code here
            }, 
        deleteRealmIfMigrationNeeded: false, 
        shouldCompactOnLaunch: nil, 
        objectTypes: nil)
   }

我们还将这个新的配置设置为默认值。

我们尝试对这两种配置使用相同的inMemoryIdentifier。当我们这样做时,新的Realm会使用初始Configuration并且不执行迁移。无论如何,Realm 在内部缓存配置是有道理的。

如果我们使用不同的标识符,则不会执行迁移 block 。了解它们都被视为不同的 Realm 。

我们想知道我们的方法是否完全错误。或者,如果我们缺少任何一点来成功完成此测试。是否有其他方法可以使用内存中的 Realms 来测试迁移 block 是否实际正确迁移?

最佳答案

迁移本质上不能在内存 Realm 上运行。内存中的 Realm 仅在关闭之前存在,并且无法在已打开的 Realm 上运行迁移。您将需要使用磁盘上的 Realm 来测试迁移逻辑(并且只需在测试结束时删除该 Realm)。

关于swift - 测试内存中 Realm 迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48330696/

相关文章:

ios - 如何快速释放 CGRect、CGPoint 类型?

javascript - 这是什么类型的单元测试?

c# - VS 团队测试 : . 以 Excel 作为数据源的网络单元测试:适配器失败

ruby-on-rails - 我可以在多对多关系中添加到现有的连接表模型吗?

ruby-on-rails - 如何在Rails迁移中将其他列的值复制为新列的默认值?

ios - coredata 获取数组元素

ios - SpriteKit 场景

swift - 如何在 Mac 上使用 Swift 读取和写入文件?

java - groovy soapUI反序列化

php - 如何使用 laravel 迁移