在rspec中使用ActiveJob执行挂起作业

Oli*_*ier 17 rspec ruby-on-rails actionmailer rails-activejob

我有这个代码用Rspec测试ActiveJob和ActionMailer我不知道如何真正执行所有排队的工作

describe 'whatever' do
  include ActiveJob::TestHelper

  after do
    clear_enqueued_jobs
  end  

  it 'should email' do
    expect(enqueued_jobs.size).to eq(1)
  end
end
Run Code Online (Sandbox Code Playgroud)

tim*_*sly 21

以下是我解决类似问题的方法:

# rails_helper.rb
RSpec.configure do |config|
  config.before :example, perform_enqueued: true do
    @old_perform_enqueued_jobs = ActiveJob::Base.queue_adapter.perform_enqueued_jobs
    @old_perform_enqueued_at_jobs = ActiveJob::Base.queue_adapter.perform_enqueued_at_jobs
    ActiveJob::Base.queue_adapter.perform_enqueued_jobs = true
    ActiveJob::Base.queue_adapter.perform_enqueued_at_jobs = true
  end

  config.after :example, perform_enqueued: true do
    ActiveJob::Base.queue_adapter.perform_enqueued_jobs = @old_perform_enqueued_jobs
    ActiveJob::Base.queue_adapter.perform_enqueued_at_jobs = @old_perform_enqueued_at_jobs
  end
end
Run Code Online (Sandbox Code Playgroud)

然后在规格中我们可以使用:

it "should perform immediately", perform_enqueued: true do
  SomeJob.perform_later  
end
Run Code Online (Sandbox Code Playgroud)


小智 15

正确的测试方法是检查排队作业的数量,如示例所示,然后分别测试每个作业.如果您想进行集成测试,可以尝试perform_enqueued_jobs帮助:

describe 'whatever' do
  include ActiveJob::TestHelper

  after do
    clear_enqueued_jobs
  end  

  it 'should email' do
    perform_enqueued_jobs do
      SomeClass.some_action
    end
  end

end
Run Code Online (Sandbox Code Playgroud)

请参阅ActiveJob :: TestHelper文档

  • 有人可以展示一个不那么人为的例子,说明接受参数的邮件会是什么样子?我似乎无法使用`OrderMailer.receipt_email(order.id)`之类的东西. (3认同)