在测试Resque(使用rspec和rails?)时,如何分离测试队列和实际队列?

jay*_*jay 3 rspec ruby-on-rails resque rspec2 ruby-on-rails-3

我想测试一些resque工作人员,以及将这些工作人员列入工作岗位的行动.我正在使用rspec和rails.

目前我有一个模型,我们称之为Article.rb,它有一个名为updates_related_categories的before_save方法,用于检查具有CategoriesSorter的作业是否需要入队.如果是这样,它会使该工作人员将作业排入队列,并使用与该文章相关的类别ID的参数.

但是,在测试中,这些作业将发送到开发服务器将作业发送到的同一队列.(我使用可以在root/redis/overview中绑定到服务器的resque服务器进行检查)

我想知道:

1)如何将测试作业发送到与开发作业不同的队列?

如果可以的话,也欢迎任何其他关于测试resque的建议.

我已经看到了一些相关的问题,这些问题表明resque-unit和resque-spec,但这些问题很不发达,我无法让它们达到有用的工作状态.另外,我听说过使用Resque.inline,但我不知道在这种情况下是否相关,因为在测试规范中没有调用resque,它是在保存测试中创建的对象时从文章模型中调用的.

示例代码:

Article.rb:

 before_save :update_related_categories
 def update_related_categories
     #some if statements/checks to see if a related category needs updating
         Resque.enqueue(CategoriesWorker, [category_id])
     end
 end
Run Code Online (Sandbox Code Playgroud)

CategoriesSorter:

 class CategoriesSorter
     @queue=:sorting_queue
     def self.perform(ids)
        ids.each do |id|
           #some code
        end
      end
 end
Run Code Online (Sandbox Code Playgroud)

眼镜:

 it "should do something" do
     @article = #set something to enqueue a job
     @article.save
     #can i check if a job is enqueued? can i send this job NOT to the development queue but a different one?
 end
Run Code Online (Sandbox Code Playgroud)

小智 6

正如我所看到的,你不想测试是否将作业排入队列中进行调用 - 我们相信Resque会做它应该做的事情.但是,您可以测试1.调用update_related_categories将作业排入队列.然后,您可以单独测试2.工作者调用执行是否产生所需的行为.

对于一般的Resque测试,resque-spec和模拟工人的组合可以实现上述两个目标.

对于1,使用resque-spec,您可以模拟在类上调用perform方法的worker,然后检查它是否已正确排入队列:

describe "Calling update_related_categories " do
  before(:each) do
    ResqueSpec.reset!
  end

  it "should enqueue the job" do
    Article.update_related_categories
    CategoriesSorter.should have_queue_size_of(1)
  end
end
Run Code Online (Sandbox Code Playgroud)

对于2,您可以创建一个Job(并指定一个单独的队列名称而不是您的开发队列),一个Resque :: Worker然后将Worker分配给Job:

def run_worker_simulation
  # see Resque::Job api for setting the args you want
  Resque::Job.create('test_queue_name', 'class_name', 'type', 'id')

  worker = Resque::Worker.new('test_queue_name')
  worker.very_verbose = true

  job = worker.reserve
  worker.perform(job)
end
Run Code Online (Sandbox Code Playgroud)

希望能给你一些想法.