Tell ActiveJob to perform_later as perform_now in Test or Spec
Today I've Learned postIf you are looking for How to test if ActiveJob job was enqueued in Rails RSpec pls check this note
RailsActiveJob
Let say you have perform_later job that is calling another
perform_later job and you want to test the end result.
class Job1 < AciveJob::Base
  def perform(foo:)
    bar = "#{foo}bar"
    Job2.perform_late(bar: bar)
  end
end
class Job2 < AciveJob::Base
  def perform(bar:)
    Httparty.post("http://myserver", bar)
  end
end
require 'spec_helper'
RSpec.describe Job1 do
  it do
    expect(Httparty).to receive(:post).with("http://myserver", "mybar")
    Job1.new.perform("my")
  end
end
Even if you set the queuing adapter to beActiveJob::Base.queue_adapter = :test
the second call may not be executed as ActiveJob is holding second call
for assertion tests
Global setting solution is described at the bottom section of this article
What you can do is wrap the call in build in ActiveJob::TestHelper module
method perform_enqueued_jobs block:
require 'spec_helper'
RSpec.describe Job1 do
  include ActiveJob::TestHelper
  it do
    perform_enqueued_jobs do
      Job1.new.perform("my")
    end
  end
end
Or if you don’t want to polute your tests with unecesarry methods:
require 'spec_helper'
module MyTest
  class Jobs
    include ActiveJob::TestHelper
  end
  def self.jobs
    @jobs ||= Jobs.new
  end
end
RSpec.describe Job1 do
  it do
    MyTest.jobs.perform_enqueued_jobs do
      Job1.new.perform("my")
    end
  end
end
Global setting
This will ensure all the tests will execute Jobs imidietly (not queue)
In config/enviroments/test.rb :
# config/enviroments/test.rb
Rails.application.configure do
  # ...
  config.active_job.queue_adapter = :inline
  # ...
end
… or
# spec/rails_helper.rb or config/enviroments/test.rb
Rails.application.config.active_job.queue_adapter = :inline
if you want to revert to original setup where you queue jobs:
Rails.application.config.active_job.queue_adapter = :async
# or
Rails.application.config.active_job.queue_adapter = :sidekiq
To learn more about Active Job adapters
Entire blog website and all the articles can be forked from this Github Repo