instance method
assert_performed_with
Ruby on Rails 7.2.3
Since v4.2.9Signature
assert_performed_with(job: nil, args: nil, at: nil, queue: nil, priority: nil, &block)
Asserts that the job has been performed with the given arguments.
def test_assert_performed_with MyJob.perform_later(1,2,3) perform_enqueued_jobs assert_performed_with(job: MyJob, args: [1,2,3]) MyJob.set(wait_until: Date.tomorrow.noon, queue: "my_queue").perform_later perform_enqueued_jobs assert_performed_with(at: Date.tomorrow.noon, queue: "my_queue") 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_performed_with at_matcher = ->(job_at) { (Date.yesterday..Date.tomorrow).cover?(job_at) } MyJob.set(wait_until: Date.today.noon).perform_later perform_enqueued_jobs assert_performed_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_performed_with args_matcher = ->(job_args) { job_args[0].key?(:foo) } MyJob.perform_later(foo: "bar", other_arg: "No need to check in the test") perform_enqueued_jobs assert_performed_with(job: MyJob, args: args_matcher) end
If a block is passed, that block performs all of the jobs that were enqueued throughout the duration of the block and asserts that the job has been performed with the given arguments in the block.
def test_assert_performed_with assert_performed_with(job: MyJob, args: [1,2,3]) do MyJob.perform_later(1,2,3) end assert_performed_with(job: MyJob, at: Date.tomorrow.noon) do MyJob.set(wait_until: Date.tomorrow.noon).perform_later end end
Parameters
-
jobkey = nil -
argskey = nil -
atkey = nil -
queuekey = nil -
prioritykey = nil -
blockblock
Source
# File activejob/lib/active_job/test_helper.rb, line 510
def assert_performed_with(job: nil, args: nil, at: nil, queue: nil, priority: nil, &block)
require_active_job_test_adapter!("assert_performed_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_performed_jobs_count = performed_jobs.count
perform_enqueued_jobs(&block)
jobs = performed_jobs.drop(original_performed_jobs_count)
else
jobs = performed_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 performed job found with #{expected}"
if potential_matches.empty?
message << "\n\nNo jobs were performed"
elsif matching_class.empty?
message << "\n\nNo jobs of class #{expected[:job]} were performed, job classes performed: "
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 510
· View on GitHub
· Improve this page
· Find usages on GitHub
Defined in ActiveJob::TestHelper