ios - “无法在写入事务之外修改托管 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()
}
解决方案
使用 no-args 初始化程序更新测试设置以初始化领域修复了该问题,例如
更换...
try! repository = BudgetRepository.init(realm: Realm(configuration: config))
... 和 ...
try! repository = BudgetRepository.init(realm: Realm())
奇怪的是,这似乎暗示使用默认配置打开一个领域,例如Realm()
,不会产生与初始化一个领域并手动提供默认配置相同的领域。
推荐阅读
- jenkins - ZAP Spider 扫描显示 0% 状态并在 Jenkins 中终止
- scala - 返回类型取决于Scala中的输入类型的通用函数?
- java - BlockingQueue的实例安全HashSet
- css - 在 React 中使用 SASS 子类
- flutter - 无法显示网络图像
- pine-script - 变量似乎保持不变
- windows - 在 Windows 服务启动后运行命令行
- c++ - 使用 WASAPI 录制音频流
- python - How to load HTML file with external link to CSS file with wxPython?
- sql - MySQL 错误 1064:您的 SQL 语法工作台 8.0 中有错误