我正在尝试为与 Realm 交互的 View 模型编写一些单元测试。在设备/模拟器上运行时,该逻辑工作正常,但在单元测试时会触发“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
变量是 View 模型类,它有一个简单的一行实现...
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()
}
最佳答案
更新测试设置以使用无参数初始化程序初始化 Realm 解决了问题,例如
更换...
尝试一下!存储库 = BudgetRepository.init( Realm : Realm (配置:配置))
...与...
尝试一下!存储库 = BudgetRepository.init( Realm :Realm())
奇怪的是,这似乎意味着使用默认配置打开一个 Realm ,例如Realm()
不会生成与初始化 Realm 并手动提供默认配置等效的 Realm。
关于ios - XCTest 中的 "Cannot modify managed RLMArray outside of a write transaction.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58899437/