我在我的应用程序中有一些复杂的长时间运行的delayed_job进程。我正在使用Rspec测试用于进程的单个方法和类,但我也想使用不同的测试数据执行许多端到端后台作业。
我在delayed_job wiki上找不到任何相关信息,这个SO问题看起来很有趣,但我真的不明白这里发生了什么。 最佳的方式是什么,可以使用rSpec测试延迟的job链? 我可以轻松地使用工厂设置测试数据,然后调用启动后台处理的类。我希望测试需要很长时间才能完成。
编辑后台代码
然后像这样运行测试。
我在delayed_job wiki上找不到任何相关信息,这个SO问题看起来很有趣,但我真的不明白这里发生了什么。 最佳的方式是什么,可以使用rSpec测试延迟的job链? 我可以轻松地使用工厂设置测试数据,然后调用启动后台处理的类。我希望测试需要很长时间才能完成。
编辑后台代码
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/factories/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)如何告诉测试在验证结果之前等待延迟调用完成?
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 ==)
should
和expect
语法。expect(status.should == true)
应该是status.should == true
或者expect(status).to == true
。 - fny