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

标签 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 实例。

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

捕获到“RLMException”,“对象已被删除或无效。”

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

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

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

最佳答案

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

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

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

关于ios - 使用 Realm 数据库进行 XCTest 单元测试中的 RLMException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37120219/

相关文章:

ios - 没有在 NSObject 类 ios swift 中获取委托(delegate)方法的回调

python - 何时使用 TestClass 实例变量与 Pytest Fixtures

ios - Realm 快速通知停止触发

android - 使用 Realm 保存数据并在不同线程中查询

ios - 这是从标签获取文本并与 iOS 中的字符串连接的标准方法吗?

ios - 获取总页数和当前页面 QuickLook

ios - 如何给 UIButton 标签赋负值?

python - 如何正确构建 SQLAlchemy(声明式)python 项目及其单元测试

java - 三叶草:它是如何工作的?

react-native - 在 React Native Realm 中向类添加新属性