提交 80dc3098 编写于 作者: Y Yuji Yaginuma 提交者: Arthur Nogueira Neves

correctly set test adapter when configure the queue adapter on a per job (#26690)

The `ActiveJob::TestHelper` replace the adapter to test adapter in
`before_setup`. It gets the target class using the `descendants`, but if
the test target job class is not loaded, will not be a replacement of
the adapter.
Therefore, instead of replacing with `before_setup`, modified to
replace when setting adapter.

Fixes #26360
上级 a57b5292
* Correctly set test adapter when configure the queue adapter on a per job.
Fixes #26360.
*Yuji Yaginuma*
* Push skipped jobs to `enqueued_jobs` when using `perform_enqueued_jobs` with a `only` filter in tests
*Alexander Pauly*
......
......@@ -8,16 +8,35 @@ module TestHelper
:performed_jobs, :performed_jobs=,
to: :queue_adapter
module TestQueueAdapter
extend ActiveSupport::Concern
included do
class_attribute :_test_adapter, instance_accessor: false, instance_predicate: false
end
module ClassMethods
def queue_adapter
self._test_adapter.nil? ? super : self._test_adapter
end
def disable_test_adapter
self._test_adapter = nil
end
def enable_test_adapter(test_adapter)
self._test_adapter = test_adapter
end
end
end
ActiveJob::Base.include(TestQueueAdapter)
def before_setup # :nodoc:
test_adapter = queue_adapter_for_test
@old_queue_adapters = (ActiveJob::Base.descendants << ActiveJob::Base).select do |klass|
# only override explicitly set adapters, a quirk of `class_attribute`
klass.singleton_class.public_instance_methods(false).include?(:_queue_adapter)
end.map do |klass|
[klass, klass.queue_adapter].tap do
klass.queue_adapter = test_adapter
end
queue_adapter_changed_jobs.each do |klass|
klass.enable_test_adapter(test_adapter)
end
clear_enqueued_jobs
......@@ -27,9 +46,8 @@ def before_setup # :nodoc:
def after_teardown # :nodoc:
super
@old_queue_adapters.each do |(klass, adapter)|
klass.queue_adapter = adapter
end
queue_adapter_changed_jobs.each { |klass| klass.disable_test_adapter }
end
# Specifies the queue adapter to use with all active job test helpers.
......@@ -358,5 +376,12 @@ def instantiate_job(payload)
job.queue_name = payload[:queue]
job
end
def queue_adapter_changed_jobs
(ActiveJob::Base.descendants << ActiveJob::Base).select do |klass|
# only override explicitly set adapters, a quirk of `class_attribute`
klass.singleton_class.public_instance_methods(false).include?(:_queue_adapter)
end
end
end
end
......@@ -21,6 +21,7 @@ class QueueAdapterTest < ActiveJob::TestCase
end
test "should allow overriding the queue_adapter at the child class level without affecting the parent or its sibling" do
ActiveJob::Base.disable_test_adapter
base_queue_adapter = ActiveJob::Base.queue_adapter
child_job_one = Class.new(ActiveJob::Base)
......
......@@ -560,3 +560,20 @@ def test_queue_adapter_is_test_adapter
assert_instance_of ActiveJob::QueueAdapters::TestAdapter, InheritedJob.queue_adapter
end
end
class QueueAdapterJobTest < ActiveJob::TestCase
def before_setup
@original_autoload_paths = ActiveSupport::Dependencies.autoload_paths
ActiveSupport::Dependencies.autoload_paths = %w(test/jobs)
super
end
def after_teardown
ActiveSupport::Dependencies.autoload_paths = @original_autoload_paths
super
end
def test_queue_adapter_is_test_adapter
assert_instance_of ActiveJob::QueueAdapters::TestAdapter, QueueAdapterJob.queue_adapter
end
end
class QueueAdapterJob < ActiveJob::Base
self.queue_adapter = :inline
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册