В моем приложении есть сложные, длительные процессы delayed_job. Я использую Rspec для проверки отдельных методов и классов, используемых в процессах, но я также хотел бы выполнить множество сквозных фоновых заданий с различными тестовыми данными.
Я ничего не мог найти в вики-странице delayed_job, и этот вопрос SO выглядит интересным, но я действительно не понял, что здесь происходит. Каков наилучший способ тестирования цепочек delayed_job с помощью rSpec?
Я могу легко настроить тестовые данные с помощью factory, а затем вызвать класс, который запускает фоновую обработку. Я ожидаю, что тесты пройдут много времени.
отредактированный код фона
class Singleplex
def perform(batch_id,user)
batch = start_batch(batch_id,user)
... do lots of stuff ...
end
handle_asynchronously :perform, queue: :singleplex, :run_at => Proc.new { 1.second.from_now }
спецификации/фабрики/batches.rb
FactoryGirl.define do
factory :batch do
batch_type 'singleplex'
name 'valid panel'
status 'ready'
end
factory :batch_detail do
chrom 7
chrom_start 140435012
chrom_end 140435012
target_offset 150
padding 4
primer3_parameter_id 1
snp_mask 't'
status 'ready'
batch
end
end
Затем запустите тест, подобный этому
describe Batch do
it 'runs Singleplex for a valid panel' do
batch = FactoryGirl.create(:batch)
user = User.find(1)
status = Singleplex.new.perform(batch.id,user)
expect(status.should == true)
end
end
У меня есть две проблемы:
1) Как сообщить тесту дождаться завершения запроса delayed_job до проверки результатов?
2) Чтобы проверить результаты, мне нужно будет проверить значения в нескольких таблицах. Каков наилучший способ сделать это в Rspec?
ИЗМЕНИТЬ
Я должен добавить, что я получаю объект delayed_job, поэтому, конечно, проверка состояния не выполняется. Обычно задания занимают не менее 10 минут.
1) Batch runs Singleplex for a valid panel
Failure/Error: expect(status.should == true)
expected: true
got: #<Delayed::Backend::ActiveRecord::Job id: nil, priority: 0, attempts: 0, handler: "--- !ruby/object:Delayed::PerformableMethod\nobject:...", last_error: nil, run_at: nil, locked_at: nil, failed_at: nil, locked_by: nil, queue: nil, created_at: nil, updated_at: nil> (using ==)