作业规范
作业规范提供了 `ActiveJob::TestHelper` 中可用的断言的替代方案,并帮助断言作业本身的行为以及其他实体是否正确地将它们排队。
作业规范以 `type: :job` 标记,或者如果设置了 `config.infer_spec_type_from_file_location!`,则将它们放在 `spec/jobs` 中。
使用作业规范,您可以
- 指定排队的作业类
- 指定传递给作业的参数
- 指定作业排队的时间
- 指定作业排队的队列
有关更多信息,请查看 have_been_enqueued
、have_enqueued_job
、have_been_performed
和 have_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`
那么 示例应该失败。