在Sequel Ruby gem

时间:2018-04-13 22:59:08

标签: ruby rspec sequel

有没有办法强制DB.transaction完成db.after_commit挂钩,因为我的规格中没有触发,因为某些原因交易仍然有效。

ruby​​ class

class Album < Sequel::Model
  def after_save
    super
    db.after_commit{ FooWorker.perform_async({ id: id }) }
  end
end

rspec的

describe Album do
  subject{ Album.new() }

  it 'executes the worker' do
    expect(FooWorker).to receive(:perform_async).once
    subject.save
  end
end

此规范被破坏,因为工作人员从未被执行过。如果我删除db.after_commit规范,但工作人员有时找不到给定的id

续集(4.41.0), rspec(3.7.0), 红宝石(2.3.1p112)

2 个答案:

答案 0 :(得分:1)

无法找到after_commit未完成交易的原因。在任何情况下,我都通过覆盖它来解决问题(注意before块)。

describe Album do
  subject{ Album.new() }

  before{ allow(DB).to receive(:after_commit){ |&block| block.call } }

  it 'executes the worker' do
    expect(FooWorker).to receive(:perform_async).once
    subject.save
  end
end

不是理想的解决方案,但它有效。

答案 1 :(得分:0)

您是否正在使用DatabaseCleaner运行测试?如果是这样,您应该 检查您配置的分类策略。如果您使用:transaction策略,则可能是因为您在从未提交的事务中测试了运行,因此您的代码未执行。尝试将策略更改为:truncation,它应该可以工作。

您甚至可以基于每个测试指定数据库清理策略。

PS。我还要补充一句,而不是期望调用perform_async,您应该检查是否正确的作业已入队。