instance method assert_enqueued_with

Ruby on Rails 7.2.3

Since v4.2.9

Available in: v4.2.9 v5.2.8.1 v6.0.6 v6.1.7.10 v7.0.10 v7.1.6 v7.2.3 v8.0.4 v8.1.2

Signature

assert_enqueued_with(job: nil, args: nil, at: nil, queue: nil, priority: nil, &block)

Asserts that the job has been enqueued with the given arguments.

def test_assert_enqueued_with
  MyJob.perform_later(1,2,3)
  assert_enqueued_with(job: MyJob, args: [1,2,3])

  MyJob.set(wait_until: Date.tomorrow.noon, queue: "my_queue").perform_later
  assert_enqueued_with(at: Date.tomorrow.noon, queue: "my_queue")
end

For keyword arguments, specify them as a hash inside an array:

def test_assert_enqueued_with_keyword_arguments
  MyJob.perform_later(arg1: 'value1', arg2: 'value2')
  assert_enqueued_with(job: MyJob, args: [{ arg1: 'value1', arg2: 'value2' }])
end

The given arguments may also be specified as matcher procs that return a boolean value indicating whether a job’s attribute meets certain criteria.

For example, a proc can be used to match a range of times:

def test_assert_enqueued_with
  at_matcher = ->(job_at) { (Date.yesterday..Date.tomorrow).cover?(job_at) }

  MyJob.set(wait_until: Date.today.noon).perform_later

  assert_enqueued_with(job: MyJob, at: at_matcher)
end

A proc can also be used to match a subset of a job’s args:

def test_assert_enqueued_with
  args_matcher = ->(job_args) { job_args[0].key?(:foo) }

  MyJob.perform_later(foo: "bar", other_arg: "No need to check in the test")

  assert_enqueued_with(job: MyJob, args: args_matcher)
end

If a block is passed, asserts that the block will cause the job to be enqueued with the given arguments.

def test_assert_enqueued_with
  assert_enqueued_with(job: MyJob, args: [1,2,3]) do
    MyJob.perform_later(1,2,3)
  end

  assert_enqueued_with(job: MyJob, at: Date.tomorrow.noon) do
    MyJob.set(wait_until: Date.tomorrow.noon).perform_later
  end
end

Parameters

job key = nil
args key = nil
at key = nil
queue key = nil
priority key = nil
block block
Source
# File activejob/lib/active_job/test_helper.rb, line 406
    def assert_enqueued_with(job: nil, args: nil, at: nil, queue: nil, priority: nil, &block)
      require_active_job_test_adapter!("assert_enqueued_with")

      expected = { job: job, args: args, at: at, queue: queue, priority: priority }.compact
      expected_args = prepare_args_for_assertion(expected)
      potential_matches = []

      if block_given?
        original_enqueued_jobs = enqueued_jobs.dup

        _assert_nothing_raised_or_warn("assert_enqueued_with", &block)

        jobs = enqueued_jobs - original_enqueued_jobs
      else
        jobs = enqueued_jobs
      end

      matching_job = jobs.find do |enqueued_job|
        deserialized_job = deserialize_args_for_assertion(enqueued_job)
        potential_matches << deserialized_job

        expected_args.all? do |key, value|
          if value.respond_to?(:call)
            value.call(deserialized_job[key])
          else
            value == deserialized_job[key]
          end
        end
      end

      matching_class = potential_matches.select do |enqueued_job|
        enqueued_job["job_class"] == job.to_s
      end

      message = +"No enqueued job found with #{expected}"
      if potential_matches.empty?
        message << "\n\nNo jobs were enqueued"
      elsif matching_class.empty?
        message << "\n\nNo jobs of class #{expected[:job]} were enqueued, job classes enqueued: "
        message << potential_matches.map { |job| job["job_class"] }.join(", ")
      else
        message << "\n\nPotential matches: #{matching_class.join("\n")}"
      end

      assert matching_job, message
      instantiate_job(matching_job)
    end

Defined in activejob/lib/active_job/test_helper.rb line 406 · View on GitHub · Improve this page · Find usages on GitHub

Defined in ActiveJob::TestHelper

Type at least 2 characters to search.

↑↓ navigate · open · esc close