Самый простой способ проверить поставленные в очередь задачи Delayed :: Job в RSpec - это запускать их в режиме реального времени. Просто добавьте следующую строку в ваши тесты RSpec:
Delayed::Worker.delay_jobs = false
Это приведет к тому, что ваши задания будут обрабатываться сразу после постановки в очередь, а не в отдельном потоке. Обычно это то, что вы хотите для тестирования, так как это детерминировано.
Два предостережения
Если вы пытаетесь проверить ошибки синхронизации, условия гонки и т. Д., Этот подход не поможет (поскольку задания обрабатываются в том же потоке, что и RSpec)
В текущей версии delayed_job (2.1.4) имеется незначительная ошибка, из-за которой перехватчики обратного вызова (постановка в очередь, before, success, error, fail) не вызываются, когда для Delayed::Worker.delay_jobs
установлено значение false
Два обходных пути
Если вам нужно протестировать ловушки обратного вызова, я знаю два обходных пути:
Получить последнюю ветку master из github. (Я не пробовал это, потому что мне нужна стабильная версия)
Вместо установки Delayed::Worker.delay_jobs = false
явно вызовите механизм запуска ди-джея в вашем тестовом коде следующим образом:
successes, failures = Delayed::Worker.new.work_off
Это обработает все, что находится в очереди заданий (опять же, в том же потоке, что и тесты RSpec) и вернет два числа: число выполненных заданий и число неудачных заданий. В настоящее время я использую этот подход, и он делает все, что мне нужно.