我正在使用乐观锁定,当更新我的对象失败时,我的目标是重试查询,直到它通过。我的问题是救援部分从未用于 rspec 测试。
我正在谈论的方法如下:
def create_transaction
amount = -1 * cost_per_word * word_count
transaction = Transaction.new(amount: amount, processor: :job_done)
transaction.service = service
transaction.job = self
transaction.save!
rescue ActiveRecord::StaleObjectError
sleep rand
reload
retry
end
StaleObjectError 是在 上生成的transaction.save!
,它有一个before_create
编辑其他对象的钩子(在这种情况下,从对象帐户中删除资金)。
为了测试它,我可以,例如,存根Transaction.new
来引发一个StaleObjectError
,但是它会生成一个无限循环。
我也无法使用类似的方法进行测试
p1 = Person.find(1)
p2 = Person.find(1)
p1.first_name = "Michael"
p1.save
p2.first_name = "should fail"
p2.save # Raises a ActiveRecord::StaleObjectError
因为我不是在测试before_save
钩子,所以我在测试create_transaction
方法。(感谢@screenmutt 的例子)
如何正确测试救援部分?