Подтвердить что ты не робот

Задержка задания не обрабатывается в rspec

Я пытаюсь запустить rspecs для специального задания с задержкой (GetPage:: GetPageJob), но у меня есть проблема.

Когда я запускаю их, задания хорошо помещаются в очередь (то есть, хорошо вставлены в таблицу delayed_jobs), но они не обрабатываются рабочим работником. Действительно, после запуска "rake jobs: work RAILS_ENV = test" в первом терминале и после запуска спецификаций во втором терминале я не вижу никакого вывода от рабочего работника в первом терминале.

С другой стороны, задания хорошо обрабатываются, если я вставляю их в очередь через "script/console test". Поэтому я немного смущен.

При использовании как спецификаций, так и консоли script/, строка, которую я использую для размещения моих заданий, это:

Delayed::Job.enqueue GetPage::GetPageJob.new("http://cnn.com")

Любая идея?

4b9b3361

Ответ 1

Самый простой способ проверить задачи с задержкой: задание в RSpec - это запустить их в режиме реального времени. Просто добавьте следующую строку в свои тесты RSpec:

Delayed::Worker.delay_jobs = false

Это приведет к тому, что ваши задания будут обработаны сразу после enqueuing, а не в отдельном потоке. Обычно это то, что вы хотите для тестирования, поскольку оно детерминировано.

Две оговорки

  • Если вы пытаетесь протестировать ошибки времени, условия гонки и т.д., этот подход не поможет (поскольку задания обрабатываются в том же потоке, что и RSpec)

  • Текущая версия delayed_job (2.1.4) имеет незначительную ошибку, в которой крючки обратного вызова (enqueue, before, success, error, failure) не вызываются, когда Delayed::Worker.delay_jobs установлено в false.

Два метода обхода

Если вам нужно проверить крючки обратного вызова, я знаю два обходных пути:

  • Получить последнюю ветвь мастера из github. (Я не пробовал, потому что мне нужна стабильная версия)

  • Вместо установки Delayed::Worker.delay_jobs = false явно вызовите механизм запуска DJ в тестовом коде следующим образом:

    successes, failures = Delayed::Worker.new.work_off

Это будет обрабатывать все, что находится в очереди заданий (опять же, в том же потоке, что и тесты RSpec), и возвращать два числа: количество выполненных заданий и количество неудачных заданий. В настоящее время я использую этот подход, и он делает все, что мне нужно.

Ответ 2

В прошлом я пытался выполнить сквозной тест логики → delayed-job → выполнить работу, и это было слишком много. Я думаю, вместо того, чтобы проверить, что полная сладкая с помощью RSpec, вы можете сосредоточиться на тестировании каждого аспекта.

Итак, проверьте, что задание вставлено. Затем, еще один тест, который проверяет, что должно произойти, когда выполняется задание.

В качестве альтернативы, высмеивайте задержанное задание, так что, когда вы ставите в очередь задание, он выполняет его сразу.

Ответ 3

Вам нужно будет запустить рабочий процесс из ваших тестов, а не из другого процесса. Попробуйте:

worker = Delayed::Worker.new(:max_priority => nil, :min_priority => nil, :quiet => true)
worker.work_off

Ответ 4

Я использую параметр config для запуска заданий в режиме реального времени:

# config/initializers/delayed_job_config.rb
Delayed::Worker.delay_jobs = !Rails.env.test?