我正在尝试使用rspec测试Resque作业。这项工作看起来像:
class ImporterJob
def perform
job_key = options['test_key']
user = options['user']
end
我正在使用Resque状态,所以我使用create方法创建这样的作业:
ImporterJob.create({key:'test_key',user: 2})
如果我尝试在rspec测试中以相同的方式创建作业,那么这些选项似乎无法完成工作。同样,当我在user = options['user']
之后插入binding.pry时,options hash是空的。
我的rspec测试看起来像这样:
describe ImporterJob do
context 'create' do
let(:import_options) {
{
'import_key' => 'test_key',
'user' => 1,
'model' => 'Test',
'another_flag' => nil
}
}
before(:all) do
Resque.redis.set('test_key',csv_file_location('data.csv'))
end
it 'validates and imports csv data' do
ImporterJob.create(import_options)
end
end
end
答案 0 :(得分:5)
对于单元测试,不建议在不同的线程/进程上运行您正在测试的代码(这是Requeue正在进行的操作)。相反,您应该通过直接运行来模拟情况。幸运的是,Resque
有一项名为inline
的功能:
# If 'inline' is true Resque will call #perform method inline
# without queuing it into Redis and without any Resque callbacks.
# If 'inline' is false Resque jobs will be put in queue regularly.
# @return [Boolean]
attr_writer :inline
# If block is supplied, this is an alias for #inline_block
# Otherwise it's an alias for #inline?
def inline(&block)
block ? inline_block(&block) : inline?
end
所以,你的测试应该是这样的:
it 'validates and imports csv data' do
Resque.inline do
ImporterJob.create(import_options)
end
end