Method: ActiveJob::TestHelper#assert_enqueued_with
- Defined in:
- activejob/lib/active_job/test_helper.rb
#assert_enqueued_with(job: nil, args: nil, at: nil, queue: nil, priority: nil, &block) ⇒ Object
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
406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 |
# 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 = +"No enqueued job found with #{expected}" if potential_matches.empty? << "\n\nNo jobs were enqueued" elsif matching_class.empty? << "\n\nNo jobs of class #{expected[:job]} were enqueued, job classes enqueued: " << 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 |