ard*_*igh 25 rspec delayed-job
我的应用程序中有一些复杂的,长时间运行的delayed_job进程.我正在使用Rspec来测试流程中使用的各个方法和类,但我还想执行许多具有不同测试数据的端到端后台作业.
我在delayed_job wiki上找不到任何关于此问题的内容,这个问题看起来很有意思但我并不真正理解这里发生了什么. 使用rSpec测试delayed_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 }
Run Code Online (Sandbox Code Playgroud)
规格/工厂/ 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
Run Code Online (Sandbox Code Playgroud)
然后像这样运行测试
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
Run Code Online (Sandbox Code Playgroud)
我有两个问题需要解决:
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 ==)
Run Code Online (Sandbox Code Playgroud)
fny*_*fny 37
有几种方法可以做到这一点.所有这些都要求您在代码中执行作业.
方法1:对作业进行排队然后告诉DelayedJob::Worker完成它的测试.
describe Batch do
it 'runs Singleplex for a valid panel' do
batch = FactoryGirl.create(:batch)
user = User.find(1)
Singleplex.new.perform(batch.id,user)
expect(Delayed::Worker.new.work_off).to eq [1, 0] # Returns [successes, failures]
# Add expectations which check multiple tables to make sure the work is done
end
end
Run Code Online (Sandbox Code Playgroud)
方法2:运行相关作业并禁用排队的测试,并检查所需结果.您可以通过调用Delayed::Worker.delay_jobs = false测试配置或before块中的某个位置来延迟排队.
before(:each) do
Delayed::Worker.delay_jobs = false
end
describe Batch do
it 'runs Singleplex for a valid panel' do
batch = FactoryGirl.create(:batch)
user = User.find(1)
Singleplex.new.perform(batch.id,user)
# expectations which check that the work is done
end
end
Run Code Online (Sandbox Code Playgroud)
然而,已知该方法会引起回调问题.
方法3:编写一个观察者,监视创建的任何新作业并运行它们.这样您就不必在测试中手动声明"work_off".Artsy对此有一个要点.
在其他地方进行测试以确保作业按预期排队也是一个好主意
it "queues welcome when a user is created" do
expect(Delayed::Job.count).to eq 0
# Create user step
expect(Delayed::Job.count).to eq 1 # You should really be looking for the count of a specific job.
end
Run Code Online (Sandbox Code Playgroud)
如果要围绕单个测试或一组测试运行延迟作业,可以将其添加到spec_helper.rb中
config.around(:each, :run_delayed_jobs) do |example|
Delayed::Worker.delay_jobs = false
example.run
Delayed::Worker.delay_jobs = true
end
Run Code Online (Sandbox Code Playgroud)
并称之为:
it 'runs the job', :run_delayed_jobs do
# delayed job magic
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17240 次 |
| 最近记录: |