Ich habe einige komplexe, lang laufende Prozesse delayed_job in meiner Anwendung. Ich verwende Rspec, um einzelne Methoden und Klassen zu testen, die in den Prozessen verwendet werden, aber ich möchte auch viele End-to-End-Hintergrundjobs mit unterschiedlichen Testdaten durchführen.Rspec testing delayed_job
Ich konnte nichts über das delayed_job-Wiki hier finden, und diese SO-Frage sieht interessant aus, aber ich habe nicht wirklich verstanden, was hier passiert. What's the best way to test delayed_job chains with rSpec?
Ich kann einfach die Testdaten mit einer Fabrik einrichten und dann die Klasse aufrufen, die die Hintergrundverarbeitung startet. Ich erwarte, dass die Tests sehr lange dauern.
bearbeitet Hintergrund Code
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 }
spec/Fabriken/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
Dann führen Sie den Test wie dieser
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
Ich habe zwei Probleme zu lösen:
1) Wie kann der Test angewiesen werden, zu warten, bis der Aufruf "delayed_job" abgeschlossen ist, bevor die Ergebnisse validiert werden?
2) Um die Ergebnisse zu validieren, müssen die Werte in mehreren Tabellen überprüft werden. Was ist der beste Weg, dies in Rspec zu tun?
EDIT
ich hinzufügen sollte ich ein delayed_job Objekt zu erhalten, so natürlich nicht die Statusprüfung. Die Arbeiten dauern in der Regel mindestens 10 Minuten.
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 ==)
By the way, es sieht aus wie Sie RSpec des 'should' und' expect' Syntax abmischen. 'expect (status.should == true)' sollte entweder 'status.should == true' oder' expect (status) .to == true' sein. – fny