ruby-on-rails 如何测试ActiveJob是否已入队?

6l7fqoea  于 2023-04-13  发布在  Ruby
关注(0)|答案(4)|浏览(167)

我有一个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

我想测试在控制器规范中是否正确调用了作业。

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

但我明白

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

第一个测试通过了,所以我知道Object保存成功了。测试ActiveJob是否排队的正确方法是什么?

9wbgstp7

9wbgstp71#

如果需要检查作业是否已多次排队,现在可以执行this

expect {
  3.times { HelloJob.perform_later }
}.to have_enqueued_job(HelloJob).at_least(2).times
aurhwmvo

aurhwmvo2#

我总是查看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

您应该确保在每个规范之后将enqueued_jobs设置为空数组,以避免任何意外行为。

ma8fv8wu

ma8fv8wu3#

在官方文档中,这里是have_enqueued_job matcher
have_enqueued_job(也称为enqueue_job)匹配器用于检查给定的ActiveJob作业是否已入队。
https://relishapp.com/rspec/rspec-rails/docs/matchers/have-enqueued-job-matcher

wxclj1h5

wxclj1h54#

我们可以使用perform_enqueued_jobs方法来等待作业完成

相关问题