首页 > 解决方案 > “无法在写入事务之外修改托管 RLMArray。” 在 XCTest

问题描述

我正在尝试为与 Realm 交互的视图模型编写一些单元测试。该逻辑在设备/模拟器上运行时工作正常,但在单元测试时会触发“RLMException”、“无法在写入事务之外修改托管 RLMArray”。

我的测试用例如下...

func testThatNewlyAddedPaymentsAreReturned() throws {
    let payment = Payment(recipient: "Matt", amount: Decimal(1.0), date: Date(), note: "")
    try model.addPayment(payment: payment) // Throws exception
    XCTAssertTrue(model.payments?.contains(payment) ?? false)
}

在上面的测试用例中,model变量是视图模型类,它有一个简单的一行实现......

func addPayment(payment: Payment) throws {
    try self.budget?.addPayment(payment: payment)
}

这反过来又调用Budget了 Realm 交互发生的类。

func addPayment(payment: Payment) throws {
    let realm = try Realm()
    try realm.write {
        _payments.append(payment)
    }
}

请注意,与异常消息相反,该private var _payments = List<Payment>()属性正在 Realm 写入事务中被修改。

我已经在单元测试中配置了默认的 Realm 配置,如下所示......

override func setUp() {
    var config = Realm.Configuration.init()
    // Set this as the configuration used for the default Realm
    Realm.Configuration.defaultConfiguration = config
    config.inMemoryIdentifier = "BudgetTests"
    try! repository = BudgetRepository.init(realm: Realm(configuration: config))
    try! initialiseViewModel()
}

标签: iosswiftrealm

解决方案


使用 no-args 初始化程序更新测试设置以初始化领域修复了该问题,例如

更换...

try! repository = BudgetRepository.init(realm: Realm(configuration: config))

... 和 ...

try! repository = BudgetRepository.init(realm: Realm())

奇怪的是,这似乎暗示使用默认配置打开一个领域,例如Realm(),不会产生与初始化一个领域并手动提供默认配置相同的领域。


推荐阅读