我有这段代码用于使用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
我有这段代码用于使用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
正确的测试方法是检查排队的任务数量,就像您的示例中一样,然后逐个测试每个任务。如果您想进行整合测试,可以尝试使用perform_enqueued_jobs助手:
正确的测试方法是像您的示例那样检查已入队的作业数量,然后逐个测试每个作业。如果您想进行集成测试,可以尝试使用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
OrderMailer.receipt_email(order.id)
这样的语法实现。 - Chris Peters以下是我解决类似问题的方法:
# 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
那么在规格中,我们可以使用:
it "should perform immediately", perform_enqueued: true do
SomeJob.perform_later
end
我有一个:inline_jobs
助手,当应用于测试时,它将执行排队的作业并清除排队的作业
module InlineJobHelpers
def self.included(example_group)
example_group.around(:each, :inline_jobs) do |example|
perform_enqueued_jobs do
example.run
end
ensure
clear_enqueued_jobs
end
end
end
RSpec.configure do |config|
config.include ActiveJob::TestHelper, :inline_jobs
config.include InlineJobHelpers, :inline_jobs
end
将所有最好的部分组合在一起,+包括sidekiq:
spec/support/perform_jobs.rb:
require 'sidekiq/testing'
RSpec.configure do |config|
Sidekiq::Testing.fake!
config.around(:each, perform_jobs: true) do |example|
Sidekiq::Testing.inline! do
queue_adapter = ActiveJob::Base.queue_adapter
old_perform_enqueued_jobs = queue_adapter.perform_enqueued_jobs
old_perform_enqueued_at_jobs = queue_adapter.perform_enqueued_at_jobs
queue_adapter.perform_enqueued_jobs = true
queue_adapter.perform_enqueued_at_jobs = true
example.run
ensure
queue_adapter.perform_enqueued_jobs = old_perform_enqueued_jobs
queue_adapter.perform_enqueued_at_jobs = old_perform_enqueued_at_jobs
end
end
end
spec/some_spec.rb:
it 'works', perform_jobs: true do
...
end