"Cannot modify managed RLMArray outside of a write transaction." 在 XCTest 中

"Cannot modify managed RLMArray outside of a write transaction." in XCTest

我正在尝试为与 Realm 交互的视图模型编写一些单元测试。在设备/模拟器上 运行 时,逻辑工作正常,但在单元测试时触发“"RLMException","Cannot modify managed RLMArray outside of a write transaction"。

我的测试用例如下...

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变量是视图模型class,它有一个简单的一行实现...

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

这又会调用 Budget class 领域交互发生的地方。

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

更新测试设置以使用无参数初始化程序初始化领域解决了问题,例如

正在替换...

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

...与...

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

奇怪的是,这似乎意味着打开一个具有默认配置的领域,例如Realm() 不会生成与初始化 Realm 和手动提供默认配置等效的 Realm。