测试内存中的Realm迁移

时间:2018-01-18 21:35:51

标签: swift unit-testing migration realm

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

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

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

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)
   }

我们还将此新Configuration设置为默认值。

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

如果我们使用不同的标识符,则不执行迁移块。了解它们都被认为是不同的领域。

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

1 个答案:

答案 0 :(得分:1)

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