有没有办法强制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
。
答案 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
,您应该检查是否正确的作业已入队。