【问题标题】:RLMException in XCTest unit tests with Realm database使用 Realm 数据库进行 XCTest 单元测试中的 RLMException
【发布时间】:2016-05-09 15:54:13
【问题描述】:

我有一系列单独的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."

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

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

更新将冲突测试分离到单独的测试目标中可以防止冲突,但这并不是真正的最佳解决方案。

【问题讨论】:

    标签: ios unit-testing realm xctest


    【解决方案1】:

    您可以尝试设置它而不是更改默认配置吗?

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

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

    【讨论】:

    • 感谢您的建议 - 我已使用此配置重新运行测试,但没有任何更改 - 虽然所有测试都位于同一目标中,但错误仍然存​​在。将它们分成两个目标意味着一切正常,
    【解决方案2】:

    Realm Swift 的官方文档建议每次测试都配置默认 Realm 以使用唯一文件 (https://realm.io/docs/swift/latest/#configuring-the-default-realm)。这应该可以满足您的第二个问题,并且至少可以防止单元测试的错误在彼此的共享状态上乱涂乱画。

    【讨论】:

    • 谢谢 - 这就是Realm.Configuration.defaultConfiguration.inMemoryIdentifier = NSUUID().UUIDStringline 所做的 - 每个测试用例都以 UUID 作为标识符运行,这应该保证唯一性。不幸的是,这在这里没有帮助。
    • 糟糕 - 抱歉!那么你可能会更好地接受 JP 的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 2011-10-04
    相关资源
    最近更新 更多