如何测试ActiveJob已入队?

And*_*vey 1 rspec ruby-on-rails rails-activejob

我有一个create动作,如果记录成功保存,则调用ActiveJob。

def create
  @object = Object.new(importer_params)
  respond_to do |format|
    if @object.save
      MyJob.perform_later( @object.id )
      format.html { redirect_to @object, notice: t('.notice') }
    else
      format.html { render :new }
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我想测试控制器规范中正确调用了Job。

describe "POST #create" do
  it {
    expect {
      post :create, { object: valid_attributes }
    }.to change(Object, :count).by(1)
  }
  it { 
    expect {
      post :create, { object: valid_attributes }
    }.to have_enqueued_job(MyJob) 
  }  
end
Run Code Online (Sandbox Code Playgroud)

但是我明白了

Failure/Error:
  expect {
    post :create, { object: valid_attributes }
  }.to have_enqueued_job(MyJob)
  expected to enqueue exactly 1 jobs, but enqueued 0
Run Code Online (Sandbox Code Playgroud)

第一次测试通过了,所以我知道对象已成功保存。测试ActiveJob入队的正确方法是什么?

Ser*_*sev 8

如果你需要检查你的工作已经排队几次,你现在可以做这个

expect {
  3.times { HelloJob.perform_later }
}.to have_enqueued_job(HelloJob).at_least(2).times
Run Code Online (Sandbox Code Playgroud)


小智 6

我一直在看的大小,ActiveJob::Base.queue_adapter.enqueued_jobs以测试是否需要一份工作。给出代码

it 'does something' do
  expect {
    post :create, { object: valid_attributes }
  }.to change {
    ActiveJob::Base.queue_adapter.enqueued_jobs.count
  }.by 1
end
Run Code Online (Sandbox Code Playgroud)

您应该确保在每个规范之后都将enqueued_jobs设置为一个空数组,以避免任何意外的行为。您可以在spec/rails_helper.rb