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

时间:2018-07-25 21:33:48

标签: ruby-on-rails-5 capybara rails-activejob

我有一个通过水豚进行的集成测试。它访问一个网页,创建一个对象,并呈现结果。创建对象后,控制器会排队几个创建一些相关对象的作业。

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

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

对于1),我试图将before(:each)中的队列适配器设置为:inline,但这不会更改适配器,它继续使用测试适配器(在我的测试中设置)。 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,但此方法无济于事,因为它似乎仅适用于传入的块中显式引用的作业。

1 个答案:

答案 0 :(得分:2)

假设您正在使用RSpec,最简单的使用perform_enqueued_jobs的方法是使用around块。结合使用metatdata标签,您可以执行类似的操作

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