Method: ActiveJob::TestHelper#assert_performed_with
- Defined in:
- activejob/lib/active_job/test_helper.rb
#assert_performed_with(job: nil, args: nil, at: nil, queue: nil, priority: nil, &block) ⇒ Object
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
510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 |
# 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 = +"No performed job found with #{expected}" if potential_matches.empty? << "\n\nNo jobs were performed" elsif matching_class.empty? << "\n\nNo jobs of class #{expected[:job]} were performed, job classes performed: " << potential_matches.map { |job| job["job_class"] }.join(", ") else << "\n\nPotential matches: #{matching_class.join("\n")}" end assert matching_job, instantiate_job(matching_job) end |