【问题标题】:How to test that ActiveJob is enqueued?如何测试 ActiveJob 是否已入队?
【发布时间】:2017-04-21 21:09:42
【问题描述】:

如果记录成功保存,我有一个调用 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

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

【问题讨论】:

    标签: ruby-on-rails rspec rails-activejob


    【解决方案1】:

    我总是查看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 设置为一个空数组,以避免任何意外行为。您可以在spec/rails_helper.rb 中执行此操作

    【讨论】:

    • 感谢@petecss,有没有办法检查是否调用了正确的作业和队列。或者甚至将正确的参数传递给作业?
    • ActiveJob::Base.queue_adapter.enqueued_jobs 是一个数组。所以你可以检查它。拨打ActiveJob::Base.queue_adapter.enqueued_jobs.first 之类的电话将为您提供第一份工作。这只是一个哈希,您可以检查 [:args] 例如为您提供一个参数数组,例如调用的方法的名称。您应该在规范中添加一个调试器,并在运行时检查 enqueued_jobs
    【解决方案2】:

    如果您需要检查您的工作是否已多次入队,您现在可以执行this

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

    【讨论】:

      【解决方案3】:

      在官方文档中,这里是 have_enqueued_job 匹配器

      have_enqueued_job(也称为 enqueue_job)匹配器用于检查给定的 ActiveJob 作业是否已入队。

      https://relishapp.com/rspec/rspec-rails/docs/matchers/have-enqueued-job-matcher

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-30
        • 2015-03-29
        • 2011-06-28
        • 1970-01-01
        • 2015-11-22
        • 1970-01-01
        • 2020-04-30
        相关资源
        最近更新 更多