作业规范

作业规范提供了 `ActiveJob::TestHelper` 中可用的断言的替代方案,并帮助断言作业本身的行为以及其他实体是否正确地将它们排队。

作业规范以 `type: :job` 标记,或者如果设置了 `config.infer_spec_type_from_file_location!`,则将它们放在 `spec/jobs` 中。

使用作业规范,您可以

有关更多信息,请查看 have_been_enqueuedhave_enqueued_jobhave_been_performedhave_performed_job 的文档。

背景

给定 活动作业可用。

指定作业已排队

给定 一个名为“spec/jobs/uploadbackupsjob_spec.rb”的文件,其中包含

require "rails_helper"

RSpec.describe UploadBackupsJob, type: :job do
  describe "#perform_later" do
    it "uploads a backup" do
      ActiveJob::Base.queue_adapter = :test
      expect {
        UploadBackupsJob.perform_later('backup')
      }.to have_enqueued_job
    end
  end
end

我运行 `rspec spec/jobs/upload_backups_job_spec.rb`

那么 示例应该通过。

指定作业已为正确的日期和时间排队

给定 一个名为“spec/jobs/uploadbackupsjob_spec.rb”的文件,其中包含

require "rails_helper"

RSpec.describe UploadBackupsJob, type: :job do
  describe "#perform_later" do
    it "uploads a backup" do
      ActiveJob::Base.queue_adapter = :test
      expect {
        UploadBackupsJob.set(wait_until: Date.tomorrow.noon, queue: "low").perform_later('backup')
      }.to have_enqueued_job.with('backup').on_queue("low").at(Date.tomorrow.noon)
    end
  end
end

我运行 `rspec spec/jobs/upload_backups_job_spec.rb`

那么 示例应该通过。

指定作业已无等待时间排队

给定 一个名为“spec/jobs/uploadbackupsjob_spec.rb”的文件,其中包含

require "rails_helper"

RSpec.describe UploadBackupsJob, type: :job do
  describe "#perform_later" do
    it "uploads a backup" do
      ActiveJob::Base.queue_adapter = :test
      expect {
        UploadBackupsJob.set(queue: "low").perform_later('backup')
      }.to have_enqueued_job.with('backup').on_queue("low").at(:no_wait)
    end
  end
end

我运行 `rspec spec/jobs/upload_backups_job_spec.rb`

那么 示例应该通过。

指定作业已按优先级排队

给定 一个名为“spec/jobs/uploadbackupsjob_spec.rb”的文件,其中包含

require "rails_helper"

RSpec.describe UploadBackupsJob, type: :job do
  describe "#perform_later" do
    it "uploads a backup" do
      ActiveJob::Base.queue_adapter = :test
      expect {
        UploadBackupsJob.set(priority: 5).perform_later
      }.to have_enqueued_job.at_priority(5)
    end
  end
end

我运行 `rspec spec/jobs/upload_backups_job_spec.rb`

那么 示例应该通过。

指定作业已使用别名块语法排队

给定 一个名为“spec/jobs/uploadbackupsjob_spec.rb”的文件,其中包含

require "rails_helper"

RSpec.describe UploadBackupsJob, type: :job do
  describe "#perform_later" do
    it "uploads a backup" do
      ActiveJob::Base.queue_adapter = :test
      expect {
        UploadBackupsJob.perform_later('backup')
      }.to enqueue_job
    end
  end
end

我运行 `rspec spec/jobs/upload_backups_job_spec.rb`

那么 示例应该通过。

指定作业已使用命令式语法排队

给定 一个名为“spec/jobs/uploadbackupsjob_spec.rb”的文件,其中包含

require "rails_helper"

RSpec.describe UploadBackupsJob, type: :job do
  describe "#perform_later" do
    it "uploads a backup" do
      ActiveJob::Base.queue_adapter = :test
      UploadBackupsJob.perform_later('backup')
      expect(UploadBackupsJob).to have_been_enqueued
    end
  end
end

我运行 `rspec spec/jobs/upload_backups_job_spec.rb`

那么 示例应该通过。

指定作业已使用命令式语法和链式期望排队

给定 一个名为“spec/jobs/uploadbackupsjob_spec.rb”的文件,其中包含

require "rails_helper"

RSpec.describe UploadBackupsJob, type: :job do
  describe "#perform_later" do
    it "uploads a backup" do
      ActiveJob::Base.queue_adapter = :test
      UploadBackupsJob.perform_later('backup')
      expect(UploadBackupsJob).to have_been_enqueued.exactly(:once)
    end
  end
end

我运行 `rspec spec/jobs/upload_backups_job_spec.rb`

那么 示例应该通过。

测试适配器必须设置为 `:test`

给定 一个名为“spec/jobs/uploadbackupsjob_spec.rb”的文件,其中包含

require "rails_helper"

RSpec.describe UploadBackupsJob, type: :job do
  describe "#perform_later" do
    it "uploads a backup" do
      ActiveJob::Base.queue_adapter = :development
    end
  end
end

我运行 `rspec spec/jobs/upload_backups_job_spec.rb`

那么 示例应该失败。