如何确保后台作业在集成测试中运行



我有一个通过capybara运行的集成测试。它访问一个网页,创建一个对象,并呈现结果。创建对象时,控制器将创建一些相关对象的几个作业排入队列。

当我运行集成测试时,我希望能够检查呈现的页面,就好像这些作业已经完成一样。两个明显的解决方案是:

  1. 将队列适配器设置为:inline
  2. 创建对象后手动执行/清除已排队的作业

对于1(,我试图将before(:each)中的队列适配器设置为:inline,但这并没有改变适配器,它继续使用测试适配器(在我的test.rb配置文件中设置(:

before(:each) { ActiveJob::Base.queue_adapter = :inline }
after(:each) { ActiveJob::Base.queue_adapter = :test }
it "should work" do
puts ActiveJob::Base.queue_adapter
end

输出:#<ActiveJob::QueueAdapters::TestAdapter:0x007f93a1061ee0 @enqueued_jobs=[], @performed_jobs=[]>

对于2(,我不确定这是否真的可能。ActiveJob::TestHelpers提供了perform_enqueued_jobs,但这种方法没有帮助,因为它似乎只适用于传入块中显式引用的作业。

假设您使用RSpec,使用perform_enqueued_jobs的最简单方法就是使用around块。将其与元数据标签相结合,你可以做一些类似的事情

RSpec.configure do |config|
config.include(RSpec::ActiveJob)
# clean out the queue after each spec
config.after(:each) do
ActiveJob::Base.queue_adapter.enqueued_jobs = []
ActiveJob::Base.queue_adapter.performed_jobs = []
end
config.around :each, perform_enqueued: true do |example|
@old_perform_enqueued_jobs = ActiveJob::Base.queue_adapter.perform_enqueued_jobs
ActiveJob::Base.queue_adapter.perform_enqueued_jobs = true
example.run
ActiveJob::Base.queue_adapter.perform_enqueued_jobs = @old_perform_enqueued_jobs
end
config.around :each, peform_enququed_at: true do |example|
@old_perform_enqueued_at_jobs = ActiveJob::Base.queue_adapter.perform_enqueued_at_jobs
ActiveJob::Base.queue_adapter.perform_enqueued_at_jobs = true
example.run
ActiveJob::Base.queue_adapter.perform_enqueued_at_jobs = @old_perform_enqueued_at_jobs
end
end

注意:如果尚未设置,则需要在config/environments/test.rb中将queue_adapter指定为:test

然后,您可以在测试中指定:perform_enqueued元数据,指定的任何作业都将运行

it "should work", :perform_enqueued do
# Jobs triggered in this test will be run
end

相关内容

最新更新