module ActiveJob::TestHelper
def assert_enqueued_with(job: nil, args: nil, at: nil, queue: nil, priority: nil, &block)
end
MyJob.set(wait_until: Date.tomorrow.noon).perform_later
assert_enqueued_with(job: MyJob, at: Date.tomorrow.noon) do
end
MyJob.perform_later(1,2,3)
assert_enqueued_with(job: MyJob, args: [1,2,3]) do
def test_assert_enqueued_with
enqueued with the given arguments.
If a block is passed, asserts that the block will cause the job to be
end
assert_enqueued_with(job: MyJob, args: args_matcher)
MyJob.perform_later(foo: "bar", other_arg: "No need to check in the test")
args_matcher = ->(job_args) { job_args[0].key?(:foo) }
def test_assert_enqueued_with
A proc can also be used to match a subset of a job's args:
end
assert_enqueued_with(job: MyJob, at: at_matcher)
MyJob.set(wait_until: Date.today.noon).perform_later
at_matcher = ->(job_at) { (Date.yesterday..Date.tomorrow).cover?(job_at) }
def test_assert_enqueued_with
For example, a proc can be used to match a range of times:
boolean value indicating whether a job's attribute meets certain criteria.
The given arguments may also be specified as matcher procs that return a
end
assert_enqueued_with(at: Date.tomorrow.noon, queue: "my_queue")
MyJob.set(wait_until: Date.tomorrow.noon, queue: "my_queue").perform_later
assert_enqueued_with(job: MyJob, args: [1,2,3])
MyJob.perform_later(1,2,3)
def test_assert_enqueued_with
Asserts that the job has been enqueued with the given arguments.
def assert_enqueued_with(job: nil, args: nil, at: nil, queue: nil, priority: nil, &block) 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