Spec-Zone.ru › Ruby on Rails 6.0

модуль ActiveJob::TestHelper

Включенные модули:
ActiveJob::TestHelper::TestQueueAdapter

Предоставляет вспомогательные методы для тестирования Active Job

Общедоступные методы экземпляра

assert_enqueued_jobs(number, only: nil, except: nil, queue: nil) { || ... } Показать исходный код
# 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
assert_enqueued_with(job: nil, args: nil, at: nil, queue: nil) { || ... } Показать исходный код
# 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
assert_no_enqueued_jobs(only: nil, except: nil, queue: nil, &block) Показать исходный код
# 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
assert_no_performed_jobs(only: nil, except: nil, queue: nil, &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
assert_performed_jobs(number, only: nil, except: nil, queue: nil, &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
assert_performed_with(job: nil, args: nil, at: nil, queue: nil, &block) Показать исходный код
# 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
perform_enqueued_jobs(only: nil, except: nil, queue: nil) { || ... } Показать исходный код
# 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
queue_adapter() Показать исходный код
# 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
queue_adapter_for_test() Показать исходный код
# 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API