使用Realm数据库进行XCTest单元测试中的RLMException

时间:2016-05-09 15:54:14

标签: ios unit-testing realm xctest

我有一系列单独的XCTest单元测试,每个测试都运行一个JSON解析函数 - 作为解析的一部分,在删除之前,删除任何Realm对象类的实例,然后再基于它们重新创建正在处理的JSON。

在每个测试类的setup()函数中,正在设置Realm实例:

    Realm.Configuration.defaultConfiguration.inMemoryIdentifier = NSUUID().UUIDString

    do {
        realm = try Realm()
    } catch let error as NSError {
        // handle error
        fatalError("Unable to establish Realm stack: \(error.localizedDescription)")
    }

    // Clear Realm of everything
    try! realm.write {
        realm.deleteAll()
    }

据我所知,这应该为每个测试创建一个完全唯一且空的Realm实例。

单独运行每个测试类都可以正常工作,但是当作为完整测试套件的一部分运行时,随机选择的测试会因错误而失败:

caught "RLMException", "Object has been deleted or invalidated."

我认为这是因为当所有测试类作为测试目标的一部分同时运行时,某处存在竞争条件。这提出了三个问题:

  • 这是竞争条件,还是我误解了错误?
  • 有没有办法绝对强制分离每个测试类中的领域以防止竞争条件?
  • 有没有办法强制测试目标同步运行每个类?

UPDATE 将碰撞测试分离到单独的测试目标可以防止碰撞,但这不是一个真正的最佳解决方案。

2 个答案:

答案 0 :(得分:1)

您可以尝试设置吗?

而不是改变默认配置
var uniqueConfiguration = Realm.Configuration.defaultConfiguration
uniqueConfiguration.inMemoryIdentifier = NSUUID().UUIDString
Realm.Configuration.defaultConfiguration = uniqueConfiguration

如果这样可行,我会将当前的Realm行为定为错误。

答案 1 :(得分:0)

Realm Swift的官方文档建议每个测试配置默认Realm以使用唯一文件(Jonathan Wakely's explanation)。这应该满足你的第二个问题,并且至少可以防止单元测试中的错误涂抹在彼此的共享状态上。