модуль ActiveJob::TestHelper
Предоставляет вспомогательные методы для тестирования Active Job
Общедоступные методы экземпляра
# File activejob/lib/active_job/test_helper.rb, line 120
def assert_enqueued_jobs(number, only: nil, except: nil, queue: nil)
if block_given?
original_count = enqueued_jobs_with(only: only, except: except, queue: queue)
yield
new_count = enqueued_jobs_with(only: only, except: except, queue: queue)
actual_count = new_count - original_count
else
actual_count = enqueued_jobs_with(only: only, except: except, queue: queue)
end
assert_equal number, actual_count, "#{number} jobs expected, but #{actual_count} were enqueued"
end Утверждает, что количество очередированных задач соответствует заданному числу.
def test_jobs
assert_enqueued_jobs 0
HelloJob.perform_later('david')
assert_enqueued_jobs 1
HelloJob.perform_later('abdelkader')
assert_enqueued_jobs 2
end
Если передан блок, утверждает, что блок приведет к очередированию указанного количества задач.
def test_jobs_again
assert_enqueued_jobs 1 do
HelloJob.perform_later('cristian')
end
assert_enqueued_jobs 2 do
HelloJob.perform_later('aaron')
HelloJob.perform_later('rafael')
end
end
Утверждает количество раз, когда была очередирована конкретная задача, передавая :only параметр.
def test_logging_job
assert_enqueued_jobs 1, only: LoggingJob do
LoggingJob.perform_later
HelloJob.perform_later('jeremy')
end
end
Утверждает количество раз, когда задача, кроме определенного класса, была очередирована, передавая :except параметр.
def test_logging_job
assert_enqueued_jobs 1, except: HelloJob do
LoggingJob.perform_later
HelloJob.perform_later('jeremy')
end
end
:only и :except параметры принимают Класс, Массив Классов или Proc. При передаче Proc, в качестве аргумента передается хеш, содержащий класс задачи и ее аргументы.
Утверждает количество раз, когда задача очередирована в определённой очереди, передавая :queue параметр.
def test_logging_job
assert_enqueued_jobs 2, queue: 'default' do
LoggingJob.perform_later
HelloJob.perform_later('elfassy')
end
end
# File activejob/lib/active_job/test_helper.rb, line 382
def assert_enqueued_with(job: nil, args: nil, at: nil, queue: nil)
expected = { job: job, args: args, at: at, queue: queue }.compact
expected_args = prepare_args_for_assertion(expected)
if block_given?
original_enqueued_jobs_count = enqueued_jobs.count
yield
jobs = enqueued_jobs.drop(original_enqueued_jobs_count)
else
jobs = enqueued_jobs
end
matching_job = jobs.find do |enqueued_job|
deserialized_job = deserialize_args_for_assertion(enqueued_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
assert matching_job, "No enqueued job found with #{expected}"
instantiate_job(matching_job)
end Утверждает, что задача была очередирована с указанными аргументами.
def test_assert_enqueued_with MyJob.perform_later(1,2,3) assert_enqueued_with(job: MyJob, args: [1,2,3], queue: 'low') MyJob.set(wait_until: Date.tomorrow.noon).perform_later assert_enqueued_with(job: MyJob, at: Date.tomorrow.noon) end
Аргумент args также принимает proc, которому будут переданы фактические аргументы задачи. Ваш proc должен вернуть булево значение, определяющее, соответствуют ли аргументы задачи вашим ожиданиям. Это полезно для проверки только подмножества аргументов.
def test_assert_enqueued_with
expected_args = ->(job_args) do
assert job_args.first.key?(:foo)
end
MyJob.perform_later(foo: 'bar', other_arg: 'No need to check in the test')
assert_enqueued_with(job: MyJob, args: expected_args, queue: 'low')
end
Если передан блок, утверждает, что блок приведет к очередированию задачи с указанными аргументами.
def test_assert_enqueued_with
assert_enqueued_with(job: MyJob, args: [1,2,3], queue: 'low') 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
# File activejob/lib/active_job/test_helper.rb, line 182 def assert_no_enqueued_jobs(only: nil, except: nil, queue: nil, &block) assert_enqueued_jobs 0, only: only, except: except, queue: queue, &block end
Утверждает, что задачи не были очередированы.
def test_jobs
assert_no_enqueued_jobs
HelloJob.perform_later('jeremy')
assert_enqueued_jobs 1
end
Если передан блок, утверждает, что блок не приведет к очередированию задач.
def test_jobs_again
assert_no_enqueued_jobs do
# No job should be enqueued from this block
end
end
Утверждает, что задачи определенного типа не были очередированы, передавая :only параметр.
def test_no_logging
assert_no_enqueued_jobs only: LoggingJob do
HelloJob.perform_later('jeremy')
end
end
Утверждает, что задач, кроме определенного класса, не было очередировано, передавая :except параметр.
def test_no_logging
assert_no_enqueued_jobs except: HelloJob do
HelloJob.perform_later('jeremy')
end
end
:only и :except параметры принимают Класс, Массив Классов или Proc. При передаче Proc, в качестве аргумента передается хеш, содержащий класс задачи и ее аргументы.
Утверждает, что задачи в определенной очереди не были очередированы, передавая :queue параметр.
def test_no_logging
assert_no_enqueued_jobs queue: 'default' do
LoggingJob.set(queue: :some_queue).perform_later
end
end
Примечание: Это утверждение просто сокращение для:
assert_enqueued_jobs 0, &block
# File activejob/lib/active_job/test_helper.rb, line 340 def assert_no_performed_jobs(only: nil, except: nil, queue: nil, &block) assert_performed_jobs 0, only: only, except: except, queue: queue, &block end
Утверждает, что задачи не были выполнены.
def test_jobs
assert_no_performed_jobs
perform_enqueued_jobs do
HelloJob.perform_later('matthew')
assert_performed_jobs 1
end
end
Если передан блок, утверждает, что блок не приведет к выполнению задач.
def test_jobs_again
assert_no_performed_jobs do
# No job should be performed from this block
end
end
Форма блока поддерживает фильтрацию. Если указан параметр :only, то будут проверены только перечисленные задачи.
def test_no_logging
assert_no_performed_jobs only: LoggingJob do
HelloJob.perform_later('jeremy')
end
end
Также, если указан параметр :except, то проверятся задачи, кроме указанного класса.
def test_no_logging
assert_no_performed_jobs except: HelloJob do
HelloJob.perform_later('jeremy')
end
end
:only и :except параметры принимают Класс, Массив Классов или Proc. При передаче Proc, в качестве аргумента передаётся экземпляр задачи.
Если указан параметр :queue, то будут проверены только задачи, очередированные в определённую очередь.
def test_assert_no_performed_jobs_with_queue_option
assert_no_performed_jobs queue: :some_queue do
HelloJob.set(queue: :other_queue).perform_later("jeremy")
end
end
Примечание: Это утверждение просто сокращение для:
assert_performed_jobs 0, &block
# File activejob/lib/active_job/test_helper.rb, line 272
def assert_performed_jobs(number, only: nil, except: nil, queue: nil, &block)
if block_given?
original_count = performed_jobs.size
perform_enqueued_jobs(only: only, except: except, queue: queue, &block)
new_count = performed_jobs.size
performed_jobs_size = new_count - original_count
else
performed_jobs_size = performed_jobs_with(only: only, except: except, queue: queue)
end
assert_equal number, performed_jobs_size, "#{number} jobs expected, but #{performed_jobs_size} were performed"
end Утверждает, что количество выполненных задач соответствует заданному числу. Если блок не передан, необходимо вызвать perform_enqueued_jobs перед или после вызова задачи.
def test_jobs
assert_performed_jobs 0
perform_enqueued_jobs do
HelloJob.perform_later('xavier')
end
assert_performed_jobs 1
HelloJob.perform_later('yves')
perform_enqueued_jobs
assert_performed_jobs 2
end
Если блок передан, утверждает, что блок вызовет выполнение заданного количества задач.
def test_jobs_again
assert_performed_jobs 1 do
HelloJob.perform_later('robin')
end
assert_performed_jobs 2 do
HelloJob.perform_later('carlos')
HelloJob.perform_later('sean')
end
end
Этот метод также поддерживает фильтрацию. Если задан параметр :only, то будут выполнены только перечисленные задачи.
def test_hello_job
assert_performed_jobs 1, only: HelloJob do
HelloJob.perform_later('jeremy')
LoggingJob.perform_later
end
end
Также, если задан параметр :except, то будут выполнены задачи, исключая задачи определённого класса.
def test_hello_job
assert_performed_jobs 1, except: LoggingJob do
HelloJob.perform_later('jeremy')
LoggingJob.perform_later
end
end
Также может быть указан массив для тестирования нескольких задач.
def test_hello_and_logging_jobs
assert_nothing_raised do
assert_performed_jobs 2, only: [HelloJob, LoggingJob] do
HelloJob.perform_later('jeremy')
LoggingJob.perform_later('stewie')
RescueJob.perform_later('david')
end
end
end
Также может быть указана процедура. При передаче Процедуры экземпляр задачи будет передан в качестве аргумента.
def test_hello_and_logging_jobs
assert_nothing_raised do
assert_performed_jobs(1, only: ->(job) { job.is_a?(HelloJob) }) do
HelloJob.perform_later('jeremy')
LoggingJob.perform_later('stewie')
RescueJob.perform_later('david')
end
end
end
Если задан параметр :queue, то будут выполнены только задачи, помещённые в определённый очередь.
def test_assert_performed_jobs_with_queue_option
assert_performed_jobs 1, queue: :some_queue do
HelloJob.set(queue: :some_queue).perform_later("jeremy")
HelloJob.set(queue: :other_queue).perform_later("bogdan")
end
end
# File activejob/lib/active_job/test_helper.rb, line 457
def assert_performed_with(job: nil, args: nil, at: nil, queue: nil, &block)
expected = { job: job, args: args, at: at, queue: queue }.compact
expected_args = prepare_args_for_assertion(expected)
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)
expected_args.all? do |key, value|
if value.respond_to?(:call)
value.call(deserialized_job[key])
else
value == deserialized_job[key]
end
end
end
assert matching_job, "No performed job found with #{expected}"
instantiate_job(matching_job)
end Утверждает, что задача была выполнена с заданными аргументами.
def test_assert_performed_with MyJob.perform_later(1,2,3) perform_enqueued_jobs assert_performed_with(job: MyJob, args: [1,2,3], queue: 'high') MyJob.set(wait_until: Date.tomorrow.noon).perform_later perform_enqueued_jobs assert_performed_with(job: MyJob, at: Date.tomorrow.noon) end
Аргумент args также принимает процедуру, которой будут переданы фактические аргументы задачи. Ваша процедура должна возвращать логическое значение, определяющее, соответствуют ли аргументы задачи вашим ожиданиям. Это полезно для проверки только подмножества аргументов.
def test_assert_performed_with
expected_args = ->(job_args) do
assert job_args.first.key?(:foo)
end
MyJob.perform_later(foo: 'bar', other_arg: 'No need to check in the test')
perform_enqueued_jobs
assert_performed_with(job: MyJob, args: expected_args, queue: 'high')
end
Если передан блок, этот блок выполняет все задачи, которые были помещены в очередь в течение выполнения блока, и утверждает, что задача была выполнена с заданными аргументами в блоке.
def test_assert_performed_with
assert_performed_with(job: MyJob, args: [1,2,3], queue: 'high') 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
# File activejob/lib/active_job/test_helper.rb, line 542
def perform_enqueued_jobs(only: nil, except: nil, queue: nil)
return flush_enqueued_jobs(only: only, except: except, queue: queue) unless block_given?
validate_option(only: only, except: except)
old_perform_enqueued_jobs = queue_adapter.perform_enqueued_jobs
old_perform_enqueued_at_jobs = queue_adapter.perform_enqueued_at_jobs
old_filter = queue_adapter.filter
old_reject = queue_adapter.reject
old_queue = queue_adapter.queue
begin
queue_adapter.perform_enqueued_jobs = true
queue_adapter.perform_enqueued_at_jobs = true
queue_adapter.filter = only
queue_adapter.reject = except
queue_adapter.queue = queue
yield
ensure
queue_adapter.perform_enqueued_jobs = old_perform_enqueued_jobs
queue_adapter.perform_enqueued_at_jobs = old_perform_enqueued_at_jobs
queue_adapter.filter = old_filter
queue_adapter.reject = old_reject
queue_adapter.queue = old_queue
end
end Выполняет все задачи в очереди. Если задан блок, выполняет все задачи, которые были помещены в очередь в течение выполнения блока. Если блок не задан, выполняет все задачи в очереди до этого момента в тесте.
def test_perform_enqueued_jobs
perform_enqueued_jobs do
MyJob.perform_later(1, 2, 3)
end
assert_performed_jobs 1
end
def test_perform_enqueued_jobs_without_block
MyJob.perform_later(1, 2, 3)
perform_enqueued_jobs
assert_performed_jobs 1
end
Этот метод также поддерживает фильтрацию. Если задан параметр :only, то будут выполнены только перечисленные задачи.
def test_perform_enqueued_jobs_with_only
perform_enqueued_jobs(only: MyJob) do
MyJob.perform_later(1, 2, 3) # will be performed
HelloJob.perform_later(1, 2, 3) # will not be performed
end
assert_performed_jobs 1
end
Также, если задан параметр :except, то будут выполнены задачи, исключая задачи определённого класса.
def test_perform_enqueued_jobs_with_except
perform_enqueued_jobs(except: HelloJob) do
MyJob.perform_later(1, 2, 3) # will be performed
HelloJob.perform_later(1, 2, 3) # will not be performed
end
assert_performed_jobs 1
end
Параметры :only и :except принимают Класс, Массив Классов или Процедуру. При передаче Процедуры экземпляр задачи будет передан в качестве аргумента.
Если задан параметр :queue, то будут выполнены только задачи, помещённые в определённый очередь.
def test_perform_enqueued_jobs_with_queue
perform_enqueued_jobs queue: :some_queue do
MyJob.set(queue: :some_queue).perform_later(1, 2, 3) # will be performed
HelloJob.set(queue: :other_queue).perform_later(1, 2, 3) # will not be performed
end
assert_performed_jobs 1
end
# File activejob/lib/active_job/test_helper.rb, line 575 def queue_adapter ActiveJob::Base.queue_adapter end
Получает доступ к адаптеру очереди, заданному в #queue_adapter, установленным в ActiveJob::Base.
def test_assert_job_has_custom_queue_adapter_set assert_instance_of CustomQueueAdapter, HelloJob.queue_adapter end
# File activejob/lib/active_job/test_helper.rb, line 63 def queue_adapter_for_test ActiveJob::QueueAdapters::TestAdapter.new end
Устанавливает адаптер очереди, который будет использоваться всеми вспомогательными методами тестов Active Job.
Возвращает экземпляр адаптера очереди и по умолчанию использует ActiveJob::QueueAdapters::TestAdapter.
Примечание: адаптер, предоставленный этим методом, должен предоставлять дополнительные методы, помимо ожидаемых от стандартного ActiveJob::QueueAdapter, чтобы его можно было использовать с вспомогательными методами тестов Active Job. Обратитесь к ActiveJob::QueueAdapters::TestAdapter.
© 2004–2019 David Heinemeier Hansson
Licensed under the MIT License.