1

我正在使用乐观锁定,当更新我的对象失败时,我的目标是重试查询,直到它通过。我的问题是救援部分从未用于 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 的例子)

如何正确测试救援部分?

4

2 回答 2

1

首先,创建对象时不会StaleObjectError引发A。编辑时可能会提出。查看文档

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

测试救援块

这就是存根的用途,从您通常看不到的方法返回特定值。

你也可以存根save!

RSpec 简单存根文档

于 2013-08-20T18:25:04.553 回答
0

我需要能够测试的答案是 Chris Healdunstub在这个答案中引用的方法

于 2013-10-12T03:07:36.360 回答