我的應用程序中有一些複雜的,長時間運行的delayed_job進程。我正在使用Rspec來測試流程中使用的各個方法和類,但我還想使用不同的測試數據執行許多端到端的後臺作業。Rspec測試delayed_job
我在delayed_job wiki上找不到任何東西,這個問題看起來很有趣,但我並不真正瞭解這裏發生了什麼。 What's the best way to test delayed_job chains with rSpec?
我可以很容易地用工廠設置測試數據,然後調用開始後臺處理的類。我預計測試需要很長時間才能完成。
編輯後臺代碼
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 ==)
順便說一句,它看起來像你混的RSpec的'should'和'expect'語法。 'expect(status.should == true)'應該是'status.should == true'或'expect(status).to == true' – fny 2014-11-03 19:55:20